Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不影响MemoryError的情况下将大量字节数组逐步写入文件_Python_Bytearray - Fatal编程技术网

Python 如何在不影响MemoryError的情况下将大量字节数组逐步写入文件

Python 如何在不影响MemoryError的情况下将大量字节数组逐步写入文件,python,bytearray,Python,Bytearray,我正在开发一种工具,用于生成用于测试目的的随机数据。请看下面我的代码中让我悲伤的部分。当文件大小在400MB左右时,这比传统的解决方案工作得更好、更快(大约需要20秒),但是,一旦文件大小达到500MB左右,就会出现内存不足错误。我如何从内存中提取内容并将其写入一个文件中,一次内存不超过10 MB def createfile(filename,size_kb): tbl = bytearray(range(256)) numrand = os.urandom(size_kb*1

我正在开发一种工具,用于生成用于测试目的的随机数据。请看下面我的代码中让我悲伤的部分。当文件大小在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文件

翻译()的目的是什么?在这段代码中,它将每个字节转换为自身,但一无所获。至于如何使用更少的内存,只需抓取块中的随机字节。。。。说1MB或其他什么,然后迭代直到所需的字节数被填满。
chunksize=1024;chunks=math.ceil(size\u kb/chunksize)
因为Uradom需要一个整数只有当size\u kb是'float1'时才需要这个,否则python将执行整数除法。其余部分由第二个numrand实例处理