我的代码中存在内存泄漏,它试图将csv读入大于内存的pandas。我使用chunksize进行迭代,但每次迭代使用的内存量都在增加(按块的大小)。 在我中断进程并清除命名空间后,我的任务管理器中的python进程仍然占用了n *大小的块,完成了n次迭代。 有谁知道循环中的哪一步在内存中创建了一些不会被删除的东西?如果是这样,我该如何强行删除它?
import pymysql
import pandas as pd
import numpy as np
import sysconn=pymysql.connect(host='localhost', port=3306, user='root', passwd='******', db='')
curr = conn.cursor()
curr.execute('CREATE DATABASE IF NOT EXISTS addclick')
curr.execute('USE addclick')
datachunks = pd.read_csv('train.csv', chunksize=1e5)
i=0
print 'Start loading main database. This may take a while. Chunks:'
for chunk in datachunks:
i=i+1
print(i)
sys.stdout.flush()
shuffle = chunk.reindex(np.random.permutation(chunk.index))
validationchunk = shuffle.iloc[:int(1e4)]
validationchunk.to_sql('validation', conn, if_exists='append', flavor='mysql', index=False)
trainchunk = shuffle.iloc[int(1e4):]
trainchunk.to_sql('train', conn, if_exists='append', flavor='mysql', index=False)
目标是将csv文件拆分为训练集和验证集,并将它们放在sql数据库中,以便更轻松地访问聚合。
答案 0 :(得分:1)
假设您使用的是pandas> = 0.15.0。我认为np.random.permutation
正在改变你正在洗牌的索引。这是一个禁忌,因为索引是不可变的。
In [1]: df = DataFrame(np.random.randn(10000))
In [2]: def f(df):
...: for dfi in np.array_split(df,100):
...: shuffle = dfi.reindex(np.random.permutation(dfi.index))
...: one = shuffle.iloc[:50]
...: two = shuffle.iloc[50:]
...:
In [3]: %memit f(df)
peak memory: 76.64 MiB, increment: 1.47 MiB
In [4]: %memit f(df)
peak memory: 77.07 MiB, increment: 0.43 MiB
In [5]: %memit f(df)
peak memory: 77.48 MiB, increment: 0.41 MiB
In [6]: %memit f(df)
peak memory: 78.09 MiB, increment: 0.61 MiB
In [7]: %memit f(df)
peak memory: 78.49 MiB, increment: 0.40 MiB
In [8]: %memit f(df)
peak memory: 78.79 MiB, increment: 0.27 MiB
所以获取值并且你可以操作它们(这会返回一个ndarray),可以操作它。
In [9]: def f2(df):
...: for dfi in np.array_split(df,100):
...: shuffle = dfi.reindex(np.random.permutation(dfi.index.values))
...: one = shuffle.iloc[:50]
...: two = shuffle.iloc[50:]
...:
In [10]: %memit f2(df)
peak memory: 78.79 MiB, increment: 0.00 MiB
In [11]: %memit f2(df)
peak memory: 78.79 MiB, increment: 0.00 MiB
In [12]: %memit f2(df)
peak memory: 78.79 MiB, increment: 0.00 MiB
In [13]: %memit f2(df)
peak memory: 78.79 MiB, increment: 0.00 MiB
In [14]: %memit f2(df)
peak memory: 78.80 MiB, increment: 0.00 MiB
In [15]: %memit f2(df)
peak memory: 78.80 MiB, increment: 0.00 MiB
不确定谁在这里发生错误(例如permutation
或索引上的保证)。