私はthisを含むいくつかの投稿を読んでいます。誰も助けなかった。ここで大きなファイルを小さなファイルに分割するときにメモリエラーが発生する
はファイル
私の入力ファイルのサイズが15Gであると私は128メガバイトにそれを分割していますが分割、私が現在持っているPythonコードです。私は、スクリプトを実行したときに私のコンピュータは、8Gメモリに
import sys
def read_line(f_object,terminal_byte):
line = ''.join(iter(lambda:f_object.read(1),terminal_byte))
line+="\x01"
return line
def read_lines(f_object,terminal_byte):
tmp = read_line(f_object,terminal_byte)
while tmp:
yield tmp
tmp = read_line(f_object,terminal_byte)
def make_chunks(f_object,terminal_byte,max_size):
current_chunk = []
current_chunk_size = 0
for line in read_lines(f_object,terminal_byte):
current_chunk.append(line)
current_chunk_size += len(line)
if current_chunk_size > max_size:
yield "".join(current_chunk)
current_chunk = []
current_chunk_size = 0
if current_chunk:
yield ''.join(current_chunk)
inputfile=sys.argv[1]
with open(inputfile,"rb") as f_in:
for i,chunk in enumerate(make_chunks(f_in, bytes(chr(1)),1024*1000*128)):
with open("out%d.txt"%i,"wb") as f_out:
f_out.write(chunk)
を持って、私は次のエラーを取得する:
Traceback (most recent call last):
File "splitter.py", line 30, in <module>
for i,chunk in enumerate(make_chunks(f_in, bytes(chr(1)),1024*1000*128)):
File "splitter.py", line 17, in make_chunks
for line in read_lines(f_object,terminal_byte):
File "splitter.py", line 12, in read_lines
tmp = read_line(f_object,terminal_byte)
File "splitter.py", line 4, in read_line
line = ''.join(iter(lambda:f_object.read(1),terminal_byte))
MemoryError
端末バイトは何ですか? 8ギガバイトのメモリを使用する前に実際にそれを探していますか?言い換えれば、どこで\ x01 'を期待していますか? –
また、あなたの 'max_size'は131072000ですが、それは*行数*であるので、内容を数えずにリスト自体は' 1024 * 1000 * 128 * 1e-9 *(8) 'になります。ギガバイトは約1.05ギガバイトです。これは、 'current_chunk'リストに含まれている*実際のオブジェクトを数えていません。 ''怠惰な犬の上に飛んだ ''クイックブラウンキツネ "のサイズの文字列は約81バイトなので、そのサイズを平均化する文字列の多くは' 1024 * 1000 * 128 * 1e-8 * 81'ギガバイト10.6ギグ!あなたのコードは、最初から失敗するように運命づけられています... –
基本的に、 '128MB'チャンクを読み書きしようとすると、これはすべて不要になります...' f_out.write(f_in.read() 128000)) 'ループで...このrigmaroleの残りの部分は、とにかく達成すると思われるものは何ですか? –