【发布时间】:2016-08-18 18:45:15
【问题描述】:
我有 1.6GB 可用于 python 进程。我正在编写一个大型 csv 文件,其中数据来自数据库。问题是:文件写入后,内存(>1.5GB)没有立即释放,导致下一段代码出错(分配内存失败,因为操作系统找不到足够的内存分配)。
是否存在任何可以帮助我释放内存的函数? 或者,您有更好的方法吗?
这是我用来写入文件的脚本,正在分块写入以处理内存问题:
size_to_read = 20000
sqlData = rs_cursor.fetchmany(size_to_read)
c = csv.writer(open(fname_location, "wb"))
c.writerow(headers)
print("- Generating file %s ..." % out_fname)
while sqlData:
for row in sqlData:
c.writerow(row)
sqlData = rs_cursor.fetchmany(size_to_read)
【问题讨论】:
-
最后一行之后出错的代码吗?还是它出错的最后一行?
-
不,它使用低内存占用了数百行,错误出现在这一行:file_obs = int(subprocess.check_output(["cat %s/%s | wc -l" % (locationToUpload, 文件名)], shell=True))
-
我可能会误解,但...
sqlData = rs_cursor.fetchmany(size_to_read)在最后一行?您刚刚写入文件的所有内容(您尚未关闭),您再次加载它吗? -
您的缩进已关闭。请修复以匹配您的实际代码,因为您有多个循环,我们无法确定一些何时终止
-
听起来内存可能正在用于文件上的缓冲区或 csv.writer 使用的对象。您可以通过在上面的代码之后添加
del c来测试它,这应该会提示 Python 恢复 c 使用的内存并关闭仅由 c 引用的文件句柄。一般来说,最好保留文件的句柄,然后在完成后显式关闭它。见stackoverflow.com/questions/3347775/csv-writer-not-closing-file