我可以在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)
答案 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/
如果有任何相关信息,请告诉我们!