我写了一个Python程序,它作用于一个大的输入文件,创建了几百万个表示三角形的对象.算法是:
在打印三角形之前打印出完整的顶点列表的OFF的要求意味着在将输出写入文件之前我必须在内存中保存三角形列表.与此同时,由于列表的大小,我遇到了内存错误.
告诉Python我不再需要某些数据的最佳方法是什么,它可以被释放?
我的python代码进程内存动态增加,因为它在必要时将动态数据存储在列表,字典和元组中.虽然在那之后所有这些动态数据都在其变量中被物理清除,但内存并没有被击落.
因此,我觉得有一个内存泄漏,我使用gc.collect()方法收集所有不同意的内存.但是当变量中没有数据时,我无法将内存降至最低.
当通过to_sql
sqlalchemy 和pandas 以及指定的chucksize 将巨大的pandas数据帧插入sqlite时,会出现内存错误。
起初我以为这是一个问题,to_sql
但是我尝试了一种解决方法,而不是使用我使用的块大小for i in range(100): df.iloc[i * 100000:(i+1):100000].to_sql(...)
,这仍然导致错误。
似乎在某些情况下,通过sqlalchemy重复插入sqlite会导致内存泄漏。
通过一个最小的示例,我很难尝试复制在转换数据时发生的内存泄漏。但这非常接近。
import string
import numpy as np
import pandas as pd
from random import randint
import random
def make_random_str_array(size=10, num_rows=100, chars=string.ascii_uppercase + string.digits):
return (np.random.choice(list(chars), num_rows*size)
.view('|U{}'.format(size)))
def alt(size, num_rows):
data = make_random_str_array(size, num_rows=2*num_rows).reshape(-1, 2)
dfAll = pd.DataFrame(data)
return dfAll
dfAll = alt(randint(1000, 2000), 10000)
for i in range(330):
print('step ', i)
data = alt(randint(1000, 2000), 10000)
df = pd.DataFrame(data)
dfAll = …
Run Code Online (Sandbox Code Playgroud)