ナンセンスな話はあまりしません。コードを見てみましょう。
import os
import time
import mmap
filename ='test.txt'
# 存在しない場合は作成してください。
if not os.path.exists(filename):open(filename,'w')print(os.path.isdir(filename))if os.path.isfile(filename):print(time.ctime(os.path.getctime(filename)))
fd = os.open(filename, os.O_RDWR)
m = mmap.mmap(fd,50, access=mmap.ACCESS_WRITE) #1024バイトのファイル。
m.seek(2)
buf1 =bytes(b'Zhang')
m[2:len(buf1)+2]= buf1
buf2 = b'Phil'
m.seek(20) #書き込み位置を配置します。
m.write(buf2) #バイトデータを書き込みます。
m.close()
fd = os.open(filename, os.O_RDWR)
m = mmap.mmap(fd,50, access=mmap.ACCESS_READ)
m.seek(20)
buf3 = m.read(len(buf2))
m.close()print(list(buf3))
操作後のtest.txtファイルの内容:
Zhang Phil
補足知識:Pythonは、バイナリファイルへのメモリマッピング、およびコンテンツへの効率的かつエレガントなランダムアクセスを行います
バイナリファイルの読み取りと書き込みはまだopen関数を使用していますか?
seek()、read()、write()のさまざまな組み合わせは疲れていますか?
mmapモジュールを使用してファイルのメモリマッピングを実現し、アレイを操作するのと同じくらい効率的で洗練されたバイナリファイルの読み取りと書き込みを行います。
まず、ファイルを開いてメモリマッピング操作を実行する方法を示す実用的な関数を提供します。
def memory_map(filename, access=mmap.ACCESS_WRITE):
size = os.path.getsize(filename)
fd = os.open(filename, os.O_RDWR)return mmap.mmap(fd, size, access=access)
この機能を使用するには、作成済みのファイルを準備し、データを入力する必要があります。
size =1000000withopen('data','wb')as f:
f.seek(size-1)
f.write(b'\x00')
次に、memory_map()関数を使用して、ファイルの内容をメモリマップできます。返されるmmapオブジェクトを使用すると、配列のようにバイナリファイルを読み書きできます。
m =memory_map('data')len(m)1000000
m[:10]
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
m[0]0
m[0:11]=b'Hello World'#スライスを変更する
m.close()withopen('data','rb')as f:#変更が有効になったことを確認します
print(f.read(11))
b'Hello World'
mmap()によって返されるmmapオブジェクトはコンテキストマネージャーとしても使用できるため、この場合、基になるファイルは自動的に閉じられます。
withmemory_map('data')as m:print(len(m))print(m[0:11])1000000
b'Hello World'
デフォルトでは、memory_map()関数によって開かれたファイルは読み取りまたは書き込みが可能です。データへの変更はすべて元のファイルにコピーされます。
読み取り専用アクセスが必要な場合は、アクセスパラメータにmmap.ACCESS_READ値を指定できます。
m = memory_map(filename, mmap.ACCESS_READ)
データをローカルで変更するだけで、これらの変更を元のファイルに書き戻したくない場合は、mmap.ACCESS_COPYパラメーターを使用できます。
m = memory_map(filename, mmap.ACCESS_COPY)
総括する:
mmapを介してファイルをメモリにマッピングした後、ファイルのコンテンツへのランダムアクセスを効率的かつエレガントに実行できます。
ファイルを開いて、さまざまなseek()、read()、およびwrite()呼び出しを組み合わせてアクセスするのではなく、ファイルをメモリにマップしてから、スライス操作を介してデータにアクセスすることをお勧めします。
ファイルのメモリマッピングによってファイル全体がメモリに読み込まれるわけではないことを強調しておく必要があります。つまり、ファイルはある種のメモリバッファまたはアレイにコピーされません。それどころか、オペレーティングシステムは、ファイルの内容のために仮想メモリの一部のみを予約します。
ファイルのさまざまな領域にアクセスすると、ファイルのこれらの領域が読み取られ、必要に応じてメモリ領域にマップされます。ただし、アクセスされたことのないファイルの部分は、単にディスクに残されます。これはすべて、透過的な方法で舞台裏で行われます。
複数のPythonインタープリターが同じファイルにメモリをマップしている場合、取得したmmapオブジェクトを使用してインタープリター間でデータを交換できます。つまり、すべてのインタープリターが同時にデータの読み取り/書き込みを行うことができ、1つのインタープリターでデータに加えられた変更は、他のインタープリターに自動的に反映されます。
同期の問題に対処するにはいくつかの追加手順が必要ですが、パイプまたはソケットを介してデータを転送する代わりに、この方法を使用できる場合もあります。
上記のPythonメモリマップファイルの読み取りと書き込みの方法は、エディターによって共有されるすべてのコンテンツです。参考にしてください。