2016-12-12 23 views
1

os.open,mmapfrom_buffer()を使用して大きなバイナリファイル(> 5 GB)を読み込もうとしています。大きなファイルの書き込みと読み込み用に開く

実行中fd = os.open(filePath, O_RDWR)エラーOSError: [Errno 22] Invalid argument: H:\\xyz.wdpが発生しました。問題は、ファイルが大きすぎるということに気付きました。類似しているが小さいファイル、O_WRONLYまたはO_RDONLYを使用してから、それは機能しました。 残念ながら、O_WRONLYまたはO_RDONLYを使用すると、from_buffer()機能(TypeError: mmap can't modify a readonly memory map.)のアクセスが拒否されます。

私のコード例は次のとおりです。

class StructData(Structure): 
    _pack_ = 1 
    _fields_ = [('bin', c_ubyte)] 

fd = os.open(filePath, os.O_RDWR) 
mmap_file = mmap.mmap(fd, length=80, access=mmap.ACCESS_WRITE, offset=0) 
d_array = StructData*80 
data = d_array.from_buffer(mmap_file) 

は、あなたは私がこの問題を解決するのに役立つだろうか?私は大きなファイルで作業することを追加したい、そして私はそれが本当に速く実行する必要がある、私はstruct.unpackなどを避けたい。

ありがとうございました!

+0

方法についてMCVE](のhttp:// stackoverflowの.com/help/mcve)? –

+0

詳細情報がなければ、問題を理解することは非常に困難です。しかし、filePath変数には構文エラーがあるようです。そのため、格納する内容を書き込むと非常に便利です。 – Jalo

+0

私の質問をサンプルコード – Pablo

答えて

1

パスを使用すると、Windowsを使用しているようです。 ドキュメント(https://docs.python.org/2/library/os.html#os.open)は、Windowsでバイナリモードでファイルを開くにはos.O_BINARYを使用する必要があると述べています。 あなたは次のことを試しましたか?

fd = os.open(filePath, os.O_RDWR | os.O_CREAT | os.O_TRUNC | os.O_BINARY) 

私は大きなファイルのサポートについてのWindowsの状況を知らない(場合は、あなたが...ファイルを作成することがあります): https://docs.python.org/2/library/posix.html

+0

うん!出来た!私の場合は、新しいファイルを作成せずに読み込んだだけですが、 'from_buffer()'は 'os.O_RDONLY'だけでは動作しません。私は 'os.O_RDWR | Os.O_BINARY'とうまくいった! mmapアクセスが 'mmap.ACCESS_WRITE'にあることも重要です。ありがとうございました! – Pablo

関連する問題