芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

最近Pythonを使って思ったこと:読み込みより書き込みの方が時間がかかる

大きめのサイズのテキストデータをPythonで処理したく,スクリプトを書いて,実行しているのですが, 対辺時間がかかってしまいます. さらに,メモリ消費も大きいためにノートPCで実行すると,大抵の場合,処理の途中でMemoryErrorが出てしまいます. ノートPCでもメモリ増設すれば何とか処理できる場合もありますがね.

そこで,

等のサイトを拝見させていただきました.

しかし,私の場合,gc.collect()で解決できませんでした. 私の書いたスクリプトは, 数MBあるテキストデータを読み込み,処理し,処理した結果を新たなファイルに書き込むというものでした. 実行時間を調べたわけではないですが,読み込み・処理・書き込みの大まかな3つの処理の前にprintを実行して, 現在どこで処理が止まっているのか可視化させたところ, 読み込みや処理はさほど時間やメモリは喰っておらず,書き込みのトコロで多くの時間やメモリを喰っているという見当がつきました.

どうやらPythonは大容量のデータに対し,読み込みよりも書き込みに大変時間とメモリ消費がかかってしまうことが分かりました. これは物理的にメモリを増やしても変わらないと思われます. では,どうすべきか?

最適解ではないかもしれませんが,私が出した答えは単純でした. 書き込む際に,データを出来るだけ小さくなるように分割したうえで書き込みを行うという事です. 大容量のデータを一括して書き込もうとするとPythonでは時間がかかってしまいますので,複数のデータに分割したうえで書き込むことで, 時間やメモリ消費を抑えることができます. picklepprintでリストを保存する場合は追記ができないので,複数のファイルが出力されるのがチョットしたデメリットではあります.

場合によっては,”書き込み処理”はPythonではなく,別のプログラミング言語を使用したほうが良いかもしれません.

う~む,Perlを使うというのも考えておく必要があるかもしれません...