2017-03-28 9 views
0

現在、私はPython 2.7のZipFileを使っています。私は複数のファイルを圧縮してユーザーに送信するというメモリの問題にぶち当たっています。私はコードがある場合ファイルを圧縮するときのPython 2.7のZipFileの動作

は:

fp = open('myzip.zip', 'w') 
archive = zipfile.ZipFile(fp, 'w', zipfile.ZIP_DEFLATED) 
for filepath in filepaths: 
    archive.write(filepath) 
archive.close() 

をPythonはいくつかの点でメモリにすべてのこれらのファイルをロードしていますか?私はPythonがファイルの内容をzipに流すと期待していただろうが、そうは確信していない。

+1

モジュールが8 * 1024文字をメモリに一度に読み込むように見えるhttps://hg.python.org/cpython/file/2.7/Lib/zipfile.py#l1179 – Sush

+0

'ZipFile.write()' doesnたくさんの記憶を消費する。前述のように、それは適度なブロックサイズを使用し、それらは使用されると解放されます。プログラムそのものが大きくなっているのですか、あるいは記憶上の問題によって他の何かを意味していますか?オペレーティングシステムは書き込みをキャッシュするので、OSがデータをコミットし始めるまでは高速になります。それから物事は少し落ちるかもしれません。 – tdelaney

+0

興味深い、OKこれは赤いニシンかもしれません –

答えて

0

This question/answer(どちらも同じユーザー)は、すべてがメモリ内で行われていることを示しています。彼らは、変更されたライブラリEnhancedZipFileへのリンクを提供していますが、あなたが望むように動作するように聞こえますが、プロジェクトではあまり活動していないようです。

特にジップに依存していない場合、this answerは、bzipライブラリが大きなファイルを処理できることを意味します。

+0

著者は書かれたファイルの名前を変更したいので、その著者は 'writestr'を使っていました。その方法では、ファイル全体をメモリに読み込む必要がありますが、ここで使用されているメソッドはそうではありません。 Python 3.6以降、 'ZipFile.open'は書き込みモードをサポートしています...これは最終的に修正されました! – tdelaney

0

Pythonは、あなたが繰り返し実行するすべてのファイルをメモリに保持します。私は、オペレーティングシステム上であなたのためにジョブを実行する実行ファイルを呼び出すこと以外は、それをバイパスする方法はありません。

+0

'ZipFile.write'のドキュメントをチェックしてください。それらは単なるファイル名であり、ファイルの内容ではありません。 OPは既存のリストを反復しています...そこには大きなヒットはありません。 – tdelaney

関連する問題