MemoryErrorを回避するために、大きなファイルを読み取るときに長い行をスキップしますか?

ジェイソン・ルー

2つの大きなtxtファイル(両方とも約100GB、10億行、いくつかの列)をスキャンし、特定の列を取り出す(新しいファイルに書き込む)必要があります。ファイルは次のようになります

ID*DATE*provider
1111*201101*1234
1234*201402*5678
3214*201003*9012
...

私のPythonスクリプトは

N100 = 10000000   ## 1% of 1 billion rows
with open("myFile.txt") as f:
    with open("myFile_c2.txt", "a") as f2:
        perc = 0
        for ind, line in enumerate(f):   ## <== MemoryError
            c0, c1, c2  = line.split("*")
            f2.write(c2+"\n")
            if ind%N100 == 0: 
                print(perc, "%")
                perc+=1

これで、上記のスクリプトは1つのファイルに対しては正常に実行されますが、62%で別のファイルに対してスタックします。エラーメッセージにはMemoryErrorが表示さfor ind, line in enumerate(f):ます。異なるRAMを搭載した異なるサーバーで数回試しましたが、エラーは同じで、すべて62%です。RAMを監視するために何時間も待ちましたが、62%のときに28GB(合計= 32GB)に爆発しました。したがって、そのファイルには、どういうわけか長すぎる(おそらく\n?で終わっていない)行があり、RAMに読み取ろうとしたときにPythonがスタックしたと思います。

だから私の質問は、データプロバイダーに行く前に、エラーラインを検出し、それを1つの巨大なラインとして読み取って回避/スキップするにはどうすればよいですか?提案に感謝します!

編集:

'エラー行'で始まるファイルは、\nではなく別の行区切り文字ですべて混乱している可能性がありますその場合、行の区切りを検出して、必要な列を破棄するのではなく、抽出を続けることができますか?ありがとう!

Robᵩ

この(テストされていない)コードは、問題を解決する可能性があります。最大メモリ消費量を削減するために、入力を読み取りあたり1,000,000バイトに制限します。

このコードは、各行から最初の100万文字を返すことに注意してください長い列に対処する方法には他の可能性があります。

  • 最初の100万文字を返す
  • 最後の100万文字を返す
  • 行を完全にスキップし、オプションでそれをログに記録するか、または
  • 例外を発生させます。
#UNTESTED
def read_start_of_line(fp):
    n = int(1e6)
    tmp = result = fp.readline(n)
    while tmp and tmp[-1] != '\n':
        tmp = fp.readline(n)
    return result

N100 = 10000000   ## 1% of 1 billion rows
with open("myFile.txt") as f:
    with open("myFile_c2.txt", "a") as f2:
        perc = 0
        for ind, line in enumerate(iter(lambda: read_start_of_line(f), '')):
            c0, c1, c2  = line.split("*")
            f2.write(c2+"\n")
            if ind%N100 == 0:
                print(perc, "%")
                perc+=1

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メモリの問題を回避するために大きなファイルの1行のみを読み取る最良の方法は何ですか?

分類Dev

テキストファイルを読み取るときに最後のx行をスキップする

分類Dev

Pythonファイルで行を読み取るときに最初の数行をスキップする

分類Dev

Pythonファイルで行を読み取るときに最初の数行をスキップする

分類Dev

Pythonで大きなテキストファイルを読み取るための本当に効率的な(高速)方法はありますか?

分類Dev

csvファイルを読み取るときに最初の行をスキップする方法は?

分類Dev

Pythonでyamlファイルを読み取るときに行をスキップする方法は?

分類Dev

ファイルを1行ずつ読み取るときに文字列をスキップする方法

分類Dev

ファイルを1行ずつ読み取るときに文字列をスキップする方法

分類Dev

numpy.genfromtxtを使用してファイルからデータを読み取るときに行をスキップする

分類Dev

Amazon S3から大きなサイズのJSONファイルを読み取る際にread()メソッドを使用する場合のMemoryError

分類Dev

Java-ファイルから読み取るときにゼロをスキップする理由

分類Dev

jsonファイルを読み取るときにキーを削除します

分類Dev

大きなフラットファイルを読み取るにはどうすればよいですか

分類Dev

Pythonプログラムは、テキストファイルを読み取るときに余分な空の行を出力します

分類Dev

C ++でファイルから入力を取得しているときに、「:」の読み取りをスキップする方法

分類Dev

複数のファイルを同時に読み取るときに、1つのファイルの特定の行のみをスキップする

分類Dev

ファイルから読み取るときに、1行おきに空の行を出力します

分類Dev

Apache BeamでCSVファイルを読み取るときにヘッダーをスキップする

分類Dev

Apache BeamでCSVファイルを読み取るときにヘッダーをスキップする

分類Dev

JavaでCSVファイルを読み取るときに空白のセルをスキップする方法は?

分類Dev

Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

分類Dev

Pythonでファイルから読み取るときに各行の一部をスキップするにはどうすればよいですか?

分類Dev

opencsv(java)を使用して.csvファイルを読み取るときに空白行をスキップする

分類Dev

csvファイルを読み取るときに最初の列をスキップするPython

分類Dev

csvファイルを読み取るときに最初の列をスキップするPython

分類Dev

pysparkセッションを使用してローカルファイルから読み取るときに、いくつかの行をスキップするにはどうすればよいですか?

分類Dev

ファイルを読み取った後、出力を印刷するときにスペースを入れない

分類Dev

メモリを使い果たすことなく大きなCSVファイルを読み取るにはどうすればよいですか?

Related 関連記事

  1. 1

    メモリの問題を回避するために大きなファイルの1行のみを読み取る最良の方法は何ですか?

  2. 2

    テキストファイルを読み取るときに最後のx行をスキップする

  3. 3

    Pythonファイルで行を読み取るときに最初の数行をスキップする

  4. 4

    Pythonファイルで行を読み取るときに最初の数行をスキップする

  5. 5

    Pythonで大きなテキストファイルを読み取るための本当に効率的な(高速)方法はありますか?

  6. 6

    csvファイルを読み取るときに最初の行をスキップする方法は?

  7. 7

    Pythonでyamlファイルを読み取るときに行をスキップする方法は?

  8. 8

    ファイルを1行ずつ読み取るときに文字列をスキップする方法

  9. 9

    ファイルを1行ずつ読み取るときに文字列をスキップする方法

  10. 10

    numpy.genfromtxtを使用してファイルからデータを読み取るときに行をスキップする

  11. 11

    Amazon S3から大きなサイズのJSONファイルを読み取る際にread()メソッドを使用する場合のMemoryError

  12. 12

    Java-ファイルから読み取るときにゼロをスキップする理由

  13. 13

    jsonファイルを読み取るときにキーを削除します

  14. 14

    大きなフラットファイルを読み取るにはどうすればよいですか

  15. 15

    Pythonプログラムは、テキストファイルを読み取るときに余分な空の行を出力します

  16. 16

    C ++でファイルから入力を取得しているときに、「:」の読み取りをスキップする方法

  17. 17

    複数のファイルを同時に読み取るときに、1つのファイルの特定の行のみをスキップする

  18. 18

    ファイルから読み取るときに、1行おきに空の行を出力します

  19. 19

    Apache BeamでCSVファイルを読み取るときにヘッダーをスキップする

  20. 20

    Apache BeamでCSVファイルを読み取るときにヘッダーをスキップする

  21. 21

    JavaでCSVファイルを読み取るときに空白のセルをスキップする方法は?

  22. 22

    Python(おそらくパンダ)でファイルから配列を読み取るときに、最初の行(メタデータを含む)を処理してスキップするエレガントな方法はありますか?

  23. 23

    Pythonでファイルから読み取るときに各行の一部をスキップするにはどうすればよいですか?

  24. 24

    opencsv(java)を使用して.csvファイルを読み取るときに空白行をスキップする

  25. 25

    csvファイルを読み取るときに最初の列をスキップするPython

  26. 26

    csvファイルを読み取るときに最初の列をスキップするPython

  27. 27

    pysparkセッションを使用してローカルファイルから読み取るときに、いくつかの行をスキップするにはどうすればよいですか?

  28. 28

    ファイルを読み取った後、出力を印刷するときにスペースを入れない

  29. 29

    メモリを使い果たすことなく大きなCSVファイルを読み取るにはどうすればよいですか?

ホットタグ

アーカイブ