问题描述
对于以下Python代码:
fp = open('output.txt', 'wb')
# Very big file, writes a lot of lines, n is a very large number
for i in range(1, n):
fp.write('something' * n)
fp.close()
上面的写作过程可以持续超过30分钟。
有时我得到错误MemoryError
。
关闭前文件的内容是存储在内存中还是写在临时文件中?
如果它在一个临时文件中,它在Linux操作系统上的一般位置是什么?
编辑:
在for循环中添加了fp.write
1楼
它存储在操作系统的内存中的磁盘缓存中,直到它被刷新到磁盘,或者由于时间或空间问题而隐式刷新,或者通过显式地 。
2楼
在Linux内核中会有写缓冲,但是在(ir)定期间隔它们将被刷新到磁盘。 用完这样的缓冲区空间不应该导致应用程序级别的内存错误; 在此之前缓冲区应该为空,在执行此操作时暂停应用程序。
3楼
以ataylor对该问题的评论为基础:
您可能想要嵌套循环。 就像是
for i in range(1,n):
for each in range n:
fp.write('something')
fp.close()
这样,唯一被放入内存的是字符串"something"
,而不是"something" * n
。
4楼
如果您写出一个写入可能会失败的大文件,最好使用fp.flush()
定期将文件自动刷新到磁盘。
通过这种方式,文件将位于您选择的位置,您可以轻松访问而不是受操作系统的支配:
fp = open('output.txt', 'wb')
counter = 0
for line in many_lines:
file.write(line)
counter += 1
if counter > 999:
fp.flush()
fp.close()
这将每1000行将文件刷新到磁盘。
5楼
如果你逐行写,那应该不是问题。
您应该在写入之前显示您正在执行的操作的代码。
首先,您可以尝试删除不必要的对象,使用fp.flush()
等。
6楼
文件写入不应该给出内存错误; 很可能,你在另一个地方有一些错误。
如果你有一个循环和一个内存错误,那么我会看你是否“泄漏”对象的引用。
就像是:
def do_something(a, b = []):
b.append(a)
return b
fp = open('output.txt', 'wb')
for i in range(1, n):
something = do_something(i)
fp.write(something)
fp.close()
我现在只是举个例子,但在实际情况下,参考泄漏可能要难得多;
但是这种情况只会泄漏do_something
中的内存,因为Python处理函数的默认参数的方式。