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

时间:2016-08-18 18:45:15

标签: python csv

我可以在python进程中使用1.6GB。我正在编写一个大型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)

1 个答案:

答案 0 :(得分:1)

我认为问题是你从未关闭过文件。试一试。

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()

另外我相信你可以像这样避免循环......

while sqlData:
    with open(fname_location, "wb") as f:
        c = csv.writer(f)
        c.writerows(sqlData) # .writerows
    sqlData = rs_cursor.fetchmany(size_to_read)

由于我没有数据,很难复制:(

修改

我知道这不是一个真正的答案,但请查看包memory_profiler进行逐行评估,看看你在哪里使用了很多内存。 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/

如果有任何相关信息,请告诉我们!