2017-05-03 5 views
1

私は、0から始まり10,000,000,000以上のような仕上がりの本当に長いリストを作成してプレーンテキストファイルに書き込もうとしています。私が現在持っているものは、すべてのRAM(12 GB)を使用し、コンピュータを再起動させます。Python:プレーンテキストファイルに本当に長い連続番号のリストを書く

i = 0 
password = [] 

file = open("pass.txt", "a") 
for i in range (10000): 
    password.append("%016d" % (i,)) 

for elem in password: 
    file.write(str(elem) + '\n') 

file.close 
print("Finished") 
+1

サイドノート:実際にファイルに 'with'ステートメントを使用する必要があります。 (制御フローが何らかの方法でブロックを出るときにいつも閉じてしまう)例外的な安全性と予測可能性の上に、「閉じる」ことを覚えておく必要もありません(この場合、実際には閉じていませんあなたが 'file.close'を呼び出さなかったので、あなたはそれをロードし、括弧を省略することによってそれを無視したので、あなたは' file.close() 'を望んでいました)。 – ShadowRanger

答えて

5

は、単にそれらを直接書き込み、listに値を保存しないでください:

# Use with statement to automatically close file properly, even on exception 
# as soon as block finishes 
with open("pass.txt", "a") as file: 
    for i in range(10000): 
     file.write("%016d\n" % i) 
print("Finished") 

バッファがいっぱいになるまであなたに書きますので、それをフラッシュし、その後、write秒をバッファリングすることあなたは固定メモリオーバーヘッドで行きます。

注:おそらくビット過度に簡潔さを犠牲にし、1つのラインの書き込み可能性、でループを置き換えることにより、(CPythonの参照インタプリタ上)C層にすべての作業をプッシュ:

file.writelines(map("%016d\n".__mod__, range(10000))) 

    # Or using format, which looks less hacky by avoiding manual use of operator overloads: 
    file.writelines(map("{:016d}\n".format, range(10000))) 

これはマイクロオプティマイゼーションです(ファイルI/Oは、Pythonでやっているよりもはるかに高価です)が、私は完全性を指摘したいと思いました。

+0

答えをありがとう!私はより読みやすくするために最初のaproachを使用しますが、とにかく知りたい! – mvico

関連する問題