私はPythonを初めて使用するので、この例が些細なことでしたら申し訳ありません。
2 つの大きなデータファイル (それぞれ約 40 GB) の一部を、わずかに変更された形式の 1 つの結果ファイルに抽出して抽出する簡単なスクリプトを作成しようとしています。最初に readlines() を使用しようとしましたが、すべてのファイルがメモリに読み込まれ、インスタンスには 28 GB のメモリしかありません。sizehint パラメーターを使用すると、ファイルの一部のみが解析されます。
私は今、ファイルを繰り返し処理しています。問題は、テキスト解析の出力を 3 つのリストに格納すると、かなり大きくなり、使用可能なメモリが不足することです。これはスワップの使用に切り替わるだけだと思っていましたが、それは問題ありませんが、代わりに「MemoryError」で終了します。
これは小さなサンプル ファイルでは問題なく機能しますが、実際のデータでは機能しません。
スクリプト:
import sys
a = []
b = []
c = []
file1 = open(sys.argv[1],"r")
for line in file1:
if '@' in line:
a.append(line.lstrip('@').rstrip('\n'))
b.append(file1.next().rstrip('\n'))
file1.close()
file2 = open(sys.argv[2],"r")
for line in file2:
if '@' in line:
c.append(file2.next().rstrip('\n'))
file2.close()
file3 = open(sys.argv[3],"w")
for i in xrange(len(a)):
file3.write("".join([">",a[i],'\n',b[i],":",c[i],"\n"]))
私がオンラインで見つけたものは、変数を格納するためのある種のデータベースを作成することを提案していますが、それは必須ではありません。これにどのように対処すればよいか、何か考えはありますか?
完全を期すために、これが私がやろうとしていることです (サンプルのテストデータから:
file1:
@Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACKIPPTCGTAG
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
file2:
@Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACAAACGATTCT
+
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
file3 (output):
>Read.Salmonella_paratyphi_A_chromosome.29004.4835/1
TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACKIPPTCGTAG:TCGTGTACAGCATTCTTTATAGTGGAACGGTGACCGTACCGCAAAGCTGCGAAATCAACGCCGGACAAACGATTCT