如何在不遇到MemoryError的情况下逐步编写一个巨大的bytearray文件

时间:2016-02-23 08:25:51

标签: python bytearray

我正在开发一种工具,可以生成用于测试目的的随机数据。请参阅下面我的代码中给我带来悲伤的部分。当文件大约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)

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

您可以一次写出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)

答案 1 :(得分:0)

将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文件