好的,我有一个将数据写入内存的功能。我试图让数据达到一定的大小(在这种情况下是一个gb)然后截断/转储到一个文件并继续进行此过程,直到这不再是要写入的数据。目前它将达到极限并截断它然后失败,并出现以下错误之一,具体取决于我如何结束该功能。
Traceback (most recent call last):
File "<pyshell#192>", line 1, in <module>
cart_for(10,'1234567890')
File "<pyshell#191>", line 8, in cart_for
x.write(''.join(p))
ValueError: I/O operation on closed file
我的职责是:
x = StringIO()
def cart_for(n, seq):
b = 8
a = 100000
size_max = 1073741824
for m in range(n, b, -1):
a = a - 1
for p in itertools.product(seq, repeat=m-1):
x.write(''.join(p))
x.write('\n')
x.seek(0, os.SEEK_END)
size = x.tell()
if size > size_max:
with open('C:/out/' + ran(8,string.ascii_letters) + '.txt', 'w') as handle:
handle.write(x.getvalue())
x.close()
x
如果我以:
结束我的职能x = StringIO()
而不是:
x
现在出现错误:
Traceback (most recent call last):
File "<pyshell#189>", line 1, in <module>
cart_for(10, '1234567890')
File "<pyshell#188>", line 8, in cart_for
x.write(''.join(p))
UnboundLocalError: local variable 'x' referenced before assignment
有关如何完成此过程的任何想法?作为参考,我相信很多人都可以假设我想要经常将内存截断到磁盘,所以我不会耗尽内存中的空间,所以函数可以继续运行直到完成。是否可以创建由静态变量定义的随机变量名来完成此操作(如果这有意义)?原谅我,我是蟒蛇新手。
答案 0 :(得分:1)
您在循环中使用x
,但是在第一次达到最大尺寸时关闭它。当循环在下一次循环时,StringIO将关闭,不能再使用了。
您应该在函数内部创建StringIO,而不是在函数外部。移动函数体内的x = StringIO()
(循环前),然后将最后一行更改为x = StringIO()
,以便每次填充旧的时都创建一个新的StringIO。