1

化学物質 A から化学物質 B に移動したいときに検索する化学パスを保持する大きな (2.2GB) テキスト区切りファイルがあります。行の列数でファイルしますか?

例:

CSV:

A B C D
E F G
H I
J K L M N

次のように並べ替える必要があります。

H I
E F G
A B C D
J K L M N 

行の長さと行のハッシュテーブルを作成することを考えていましたが、csv ファイルが大きくなるにつれて: (化学ネットワークで最長のパスを実行しており、2.2GB (30mil のパス) は長さ <= 10 のみです)、私は、このアプローチが最速ではないかもしれないと予想しています。

4

1 に答える 1

5

長さに基づいてそれらを別々のファイルに分割し、後でそれらを結合し直します-次のようなものです:

from tempfile import TemporaryFile
from itertools import chain

ファイル長 -> 出力ファイルの参照辞書を保持します。ファイルが既に開いている場合は、そのファイルに書き込むか、新しい一時ファイルを作成します。

output = {}
with open('input') as fin:
    for line in fin:
        length = len(line.split())
        output.setdefault(length, TemporaryFile()).write(line)

Steven Rumbalski が指摘したように、これはdefaultdict:

from collections import defaultdict
output = defaultdict(TemporaryFile)
...
output[length].write(line)

一時ファイルはすべてファイルの最後を指しています。それらを最初にリセットして、それらを読んだときにデータを再度取得します...

for fh in output.values():
    fh.seek(0)

各ファイルから長さの昇順で行を取得し、それらすべてを最終出力ファイルに書き込みます。

with open('output', 'w') as fout:
    fout.writelines(chain.from_iterable(v for k,v in sorted(output.iteritems())))

Python は、プログラムの終了時に一時ファイルをクリーンアップする必要があります...

于 2013-07-11T22:01:39.843 に答える