使用后如何释放内存csv.writer在python中?

2024-09-25 00:31:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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)

Tags: 文件csvto内存readsize进程fname
1条回答
网友
1楼 · 发布于 2024-09-25 00:31:50

我想问题是你从来没有关闭过这个文件。试试看。在

size_to_read = 20000
sqlData = rs_cursor.fetchmany(size_to_read)

with open(fname_location, "wb")) as f:
    c = csv.writer(f)
    c.writerow(headers)

print("- Generating file %s ..." % out_fname)

while sqlData:
    with open(fname_location, "a") as f: # "a" means to append
        c = csv.writer(f)
        for row in sqlData:
            c.writerow(row)
    sqlData = rs_cursor.fetchmany(size_to_read)

使用with可以自动关闭文件并释放内存。避免显式调用c.close()

我也相信你可以避免这样的循环。。。在

^{pr2}$

很难复制,因为我没有数据:(

编辑

我知道这并不是一个真正的答案,但是请查看包memory_profiler进行逐行评估,看看你在哪里使用了大量的mem。https://pypi.python.org/pypi/memory_profiler

编辑2

下面是一个使用生成器保持低内存使用率的示例。在

def results_iter(cursor, n=10000):
    while True:
        results = cursor.fetchmany(n)
        if not results:
            break
        for result in results:
            yield result

with open('file.csv') as f:
    c = csv.writer(f)
    for result in results_iter(rs_cursor, size_to_read)
        c.writerow(result)

通过http://code.activestate.com/recipes/137270-use-generators-for-fetching-large-db-record-sets/

如果有任何效果,请告诉我们!在

相关问题 更多 >