如何在不遇到 MemoryError 的情况下逐步将一个巨大的字节数组写入文件
How to write an huge bytearray to file progressively without hitting MemoryError
我正在开发一种工具,可以生成用于测试目的的随机数据。请参阅下面让我感到悲伤的代码部分。当文件大约为 400MB 时,这比传统解决方案完美且更快(大约需要 20 秒),但是,一旦文件达到大约 500MB,我就会收到内存不足错误。如何从内存中提取内容并将其逐步写入内存中一次不超过 10 MB 的文件。
def createfile(filename,size_kb):
tbl = bytearray(range(256))
numrand = os.urandom(size_kb*1024)
with open(filename,"wb") as fh:
fh.write(numrand.translate(tbl))
createfile("file1.txt",500*1024)
任何帮助将不胜感激
您可以一次写出 10MB 的块,而不是一次性生成整个文件。正如@mhawke 所指出的,translate
调用是多余的,可以删除:
def createfile(filename,size_kb):
chunks = size_kb /(1024*10)
with open(filename,"wb") as fh:
for iter in range(chunks):
numrand = os.urandom(size_kb*1024 / chunks)
fh.write(numrand)
numrand = os.urandom(size_kb*1024 % chunks)
fh.write(numrand)
createfile("c:/file1.txt",500*1024)
组合 Jaco 和 mhawk 并处理一些浮点数转换。这是可以在不到 10 秒内生成 Gbs 数据的代码
def createfile(filename,size_kb):
chunksize = 1024
chunks = math.ceil(size_kb / chunksize)
with open(filename,"wb") as fh:
for iter in range(chunks):
numrand = os.urandom(int(size_kb*1024 / chunks))
fh.write(numrand)
numrand = os.urandom(int(size_kb*1024 % chunks))
fh.write(numrand)
在 8 秒内创建 1 Gb 文件
我正在开发一种工具,可以生成用于测试目的的随机数据。请参阅下面让我感到悲伤的代码部分。当文件大约为 400MB 时,这比传统解决方案完美且更快(大约需要 20 秒),但是,一旦文件达到大约 500MB,我就会收到内存不足错误。如何从内存中提取内容并将其逐步写入内存中一次不超过 10 MB 的文件。
def createfile(filename,size_kb):
tbl = bytearray(range(256))
numrand = os.urandom(size_kb*1024)
with open(filename,"wb") as fh:
fh.write(numrand.translate(tbl))
createfile("file1.txt",500*1024)
任何帮助将不胜感激
您可以一次写出 10MB 的块,而不是一次性生成整个文件。正如@mhawke 所指出的,translate
调用是多余的,可以删除:
def createfile(filename,size_kb):
chunks = size_kb /(1024*10)
with open(filename,"wb") as fh:
for iter in range(chunks):
numrand = os.urandom(size_kb*1024 / chunks)
fh.write(numrand)
numrand = os.urandom(size_kb*1024 % chunks)
fh.write(numrand)
createfile("c:/file1.txt",500*1024)
组合 Jaco 和 mhawk 并处理一些浮点数转换。这是可以在不到 10 秒内生成 Gbs 数据的代码
def createfile(filename,size_kb):
chunksize = 1024
chunks = math.ceil(size_kb / chunksize)
with open(filename,"wb") as fh:
for iter in range(chunks):
numrand = os.urandom(int(size_kb*1024 / chunks))
fh.write(numrand)
numrand = os.urandom(int(size_kb*1024 % chunks))
fh.write(numrand)
在 8 秒内创建 1 Gb 文件