当前位置: 代码迷 >> python >> Python“open”函数是否将其内容保存在内存或临时文件中?
  详细解决方案

Python“open”函数是否将其内容保存在内存或临时文件中?

热度:7   发布时间:2023-07-14 09:52:08.0

对于以下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

它存储在操作系统的内存中的磁盘缓存中,直到它被刷新到磁盘,或者由于时间或空间问题而隐式刷新,或者通过显式地 。

在Linux内核中会有写缓冲,但是在(ir)定期间隔它们将被刷新到磁盘。 用完这样的缓冲区空间不应该导致应用程序级别的内存错误; 在此之前缓冲区应该为空,在执行此操作时暂停应用程序。

以ataylor对该问题的评论为基础:

您可能想要嵌套循环。 就像是

for i in range(1,n):
    for each in range n:
        fp.write('something')
fp.close()

这样,唯一被放入内存的是字符串"something" ,而不是"something" * n

如果您写出一个写入可能会失败的大文件,最好使用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行将文件刷新到磁盘。

如果你逐行写,那应该不是问题。 您应该在写入之前显示您正在执行的操作的代码。 首先,您可以尝试删除不必要的对象,使用fp.flush()等。

文件写入不应该给出内存错误; 很可能,你在另一个地方有一些错误。

如果你有一个循环和一个内存错误,那么我会看你是否“泄漏”对象的引用。
就像是:

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处理函数的默认参数的方式。

  相关解决方案