ホームページ >バックエンド開発 >PHPチュートリアル >Pythonを使用して大きなファイルを読み取る方法
この記事では、主にPythonを使用して大きなファイルを読み取る方法を紹介しますので、必要な友達は参考にしてください
背景
最近テキストドキュメントを処理すると(ファイルサイズが約2GBです)、memoryErrorエラーが発生します。ファイルの読み込みが遅すぎるという問題があったため、後で大きなファイルの読み込みを高速化する 2 つの方法を見つけました。この記事では、これら 2 つの読み込み方法を紹介します。
準備
「テキスト処理」について話すときは、通常、処理している内容を意味します。 Python を使用すると、テキスト ファイルの内容を操作可能な文字列変数に読み込むことが非常に簡単になります。ファイル オブジェクトには、.read()、.readline()、.readlines() という 3 つの「読み取り」メソッドが用意されています。各メソッドは変数を受け入れて、毎回読み取られるデータ量を制限できますが、通常は変数を使用しません。 .read() は一度にファイル全体を読み取り、通常はファイルの内容を文字列変数に入れるために使用されます。ただし、.read() はファイルの内容の最も直接的な文字列表現を生成しますが、連続的な行指向の処理には不要であり、ファイルが使用可能なメモリよりも大きい場合、そのような処理は不可能です。以下は read() メソッドの例です:
try: f = open('/path/to/file', 'r') print f.read() finally: if f: f.close()
read() を呼び出すと、ファイルが 10G の場合、メモリが爆発的に増加します。安全側として、read(repeat.size) メソッドを呼び出して、毎回最大 size バイトのコンテンツを読み取ることができます。さらに、readline() を呼び出すと、一度に 1 行のコンテンツを読み取ることができ、readlines() を呼び出すと、すべてのコンテンツを一度に読み取って、行ごとにリストを返すことができます。したがって、必要に応じて呼び出し方法を決定する必要があります。
ファイルが小さい場合は、read() を一度に読み取るのが最も便利です。ファイルのサイズが特定できない場合は、read(size)
を繰り返し呼び出す方が安全です。 call readlines():
for line in f.readlines(): process(line) #
ブロックされた読み取り
大きなファイルを処理するために、大きなファイルをいくつかの小さなファイルに分割し、その部分を解放することによって、大きなファイルを処理することを考えるのは簡単です。各小さなファイルを処理した後のメモリ。ここでは Iter と yield が使用されています:
def read_in_chunks(filePath, chunk_size=1024*1024): """ Lazy function (generator) to read a file piece by piece. Default chunk size: 1M You can set your own chunk size """ file_object = open(filePath) while True: chunk_data = file_object.read(chunk_size) if not chunk_data: break yield chunk_data if __name__ == "__main__": filePath = './path/filename' for chunk in read_in_chunks(filePath): process(chunk) # <do something with chunk>
With open()
with ステートメントを使用して、内部ブロック例外のスローを含め、ファイルを開いたり閉じたりします。 for line in f file object f はイテレータとして扱われ、バッファリングされた IO とメモリ管理を自動的に使用するため、大きなファイルについて心配する必要はありません。
コードは次のとおりです:
#If the file is line based with open(...) as f: for line in f: process(line) # <do something with line>
最適化
数百万行の大きなデータに直面する場合、openを使用しても問題はありませんが、ここでパラメータが異なると効率も異なります。テストの結果、最初のパラメータが「rb」のときの効率は「r」の 6 倍でした。バイナリ読み取りが依然として最速のモードであることがわかります。
with open(filename,"rb") as f: for fLine in f: pass
テスト結果: rb メソッドが最も速く、2.9 秒で 100 万行を走査します。基本的には、中規模および大規模なファイル処理の効率ニーズを満たすことができます。 rb (セカンダリ システム リード) からの読み取りを r (リード モード) に変更すると、5 ~ 6 倍遅くなります。
結論
Pythonを使用して大きなファイルを読み取る場合は、最も単純な方法を使用し、インタプリタに任せて、自分の作業だけを行う必要があります。同時に、さまざまなニーズに応じてさまざまな読み取りパラメータを選択し、さらに高いパフォーマンスを得ることができます。
関連する推奨事項:
Pythonがテキストデータを読み取り、DataFrame形式に変換する方法の詳細な説明
以上がPythonを使用して大きなファイルを読み取る方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。