0

Python を使用してトレース ファイルを処理することに関して 1 つの問題があります (10 億行のデータが含まれています)。

私がやりたいことは、プログラムがファイル内の特定の行 (行番号 x など) を見つけ、ファイル内のこの行 (行番号 x) から別のシンボルを見つける必要があるということです。行が見つかったら、もう一度 (行番号 x) から別の行を検索します。

私が今やったことは次のとおりですが、問題は常にファイルを再度開き、最初から読み取って一致するものを見つける必要があることです(行#> x、および必要な記号が含まれています)。1 つの大きなトレース ファイルの場合、処理に時間がかかりすぎます。

1.

    for line in file.readlines()
      i++ #update the line number
      if i > x:
          if (line.find()):

また:

   for i, line in enumerate(open(file)):
      if i > x:
          if ....

より良いアイデアのヒントを教えてくれる人はいますか?

ありがとう

4

2 に答える 2

2

それ以外の点でファイルが安定している場合は、を使用fileobj.tell()してファイル内の自分の位置を記憶し、次にを使用fileobj.seek(pos)してファイル内の同じ位置に戻ります。

これは、ファイルオブジェクトをイテレータ(noまたは)として使用しない場合にのみ機能します。これは、正確な位置を不明瞭にする先読みバッファを使用するためです。for line in fileobject)next(fileobject)

代わりに、以下を使用してください。

for line in iter(fileobj.readline, ''):

fileobj反復コンテキストで引き続き使用します。

于 2013-02-18T17:13:23.823 に答える
0

ランダム アクセスを使用して、回線の開始位置を記録することをお勧めします。何かのようなもの:

index = []

fh = open(gash.txt)

for line in fh:
    if target in line:
        index.append(fh.tell() - len(line))

その後、内容を呼び出したい場合は を使用しますfh.seek(index[n])

いくつかの「落とし穴」:

  1. インデックス位置は行番号と同じではないことに注意してください。行番号が必要な場合は、行番号をキーにして辞書を使用してください。

  2. Windows では、ファイルの位置を -1 ずつ調整する必要があります。これは、「\r」が取り除かれ、len(line).

于 2013-02-18T17:21:41.000 に答える