2014-11-22 32 views
2

我的代碼中有一個內存泄漏,它試圖將csv讀入內存過大的pandas。我使用chunksize進行迭代,但每次迭代所使用的內存量正在增加(按塊的大小)。 在我中斷了進程並清除了命名空間之後,我的任務管理器中的python進程仍然佔用n *塊大小,並完成了n次迭代。 有誰知道循環中的哪一步在內存中創建了一些不被刪除的東西?而且,如果是這樣,我該如何強行刪除它?python熊貓重新編譯索引中的內存泄露

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數據庫來聚集更容易獲得。

回答

1

因此,假設您使用熊貓> = 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或索引)。