0

ほぼ100000行のファイルがあります。クリーニング処理(小文字、ストップワードの削除など)をしたいのですが、時間がかかります。

10000 の例では、スクリプトに 15 分かかります。すべてのファイルについて、150 分かかると予想しています。ただし5時間かかります。

最初に、これを読み取るためにファイルを使用します。

fileinput = open('tweets.txt', 'r')

lines = fileinput.read().lower() #for lower case, however it load all file

for line in fileinput:
    lines = line.lower() 

質問: 最初の 10000 行を読み取ってクリーニングのプロセスを作成し、その後、次のブログの行などを読み取る方法を使用できますか?

4

3 に答える 3

2

ファイル全体を一度に読み込むのではなく、1 行ずつ操作することを強くお勧めします (つまり、 を使用しないでください.read())。

with open('tweets.txt', 'r') as fileinput:
    for line in fileinput:
        line = line.lower()
        # ... do something with line ...
        # (for example, write the line to a new file, or print it)

これにより、Python の組み込みバッファリング機能が自動的に利用されます

于 2013-01-04T09:59:21.980 に答える
1

一度に 1 行ずつファイルを操作してみてください。

lowered = []    

with open('tweets.txt', 'r') as handle:
    for line in handle:
        # keep accumulating the results ...
        lowered.append(line.lower())
        # or just dump the to stdout right away
        print(line)

for line in lowered:
    # print or write to file or whatever you require

これにより、大きなファイルの場合にスワッピングが発生し、パフォーマンスが低下する可能性があるメモリ オーバーヘッドが削減されます。

以下は、約 100 万行のファイルのベンチマークです。

# (1) real 0.223    user 0.195  sys 0.026   pcpu 98.71
with open('medium.txt') as handle:
  for line in handle:
      pass

# (2) real 0.295    user 0.262  sys 0.025   pcpu 97.21
with open('medium.txt') as handle:
    for i, line in enumerate(handle):
        pass
    print(i) # 1031124

# (3) real 21.561 user 5.072  sys 3.530   pcpu 39.89
with open('medium.txt') as handle:
    for i, line in enumerate(handle):
        print(line.lower())

# (4) real 1.702  user 1.605  sys 0.089   pcpu 99.50
lowered = []
with open('medium.txt') as handle:
    for i, line in enumerate(handle):
        lowered.append(line.lower())

# (5) real 2.307  user 1.983  sys 0.159   pcpu 92.89
lowered = []
with open('medium.txt', 'r') as handle:
    for i, line in enumerate(handle):
        lowered.append(line.lower())

with open('lowered.txt', 'w') as handle:
    for line in lowered:
        handle.write(line)

一度に 2 つのファイルを反復処理することもできます。

# (6) real 1.944  user 1.666  sys 0.115   pcpu 91.59
with open('medium.txt', 'r') as src, open('lowered.txt', 'w') as sink:
    for i, line in enumerate(src):
        sink.write(line.lower())

表としての結果:

# (1) noop                   0.223
# (2) w/ enumerate           0.295
# (4) list buffer            1.702
# (6) on-the-fly             1.944
# (5) r -> list buffer -> w  2.307
# (3) stdout print          21.561
于 2013-01-04T09:59:39.353 に答える
0

スクリプトを次のように変更します。

with open('tweets.txt', 'r') as fileinput:
  for line in fileinput:
    """do what you need to do with each line"""
    line = line.lower()

したがって、基本的に、 を使用してファイル全体をメモリに読み込むのではなくread()、開いているファイルの行を反復処理するだけです。巨大なファイルをメモリに読み込むと、システムがその一部をスワップアウトする必要があるところまでプロセスが成長し、非常に遅くなる可能性があります。

于 2013-01-04T09:59:13.150 に答える