Pandas MemoryError读取大型CSV后跟`.iloc`切片列

时间:2016-03-18 08:03:21

标签: python pandas csv memory file-io

我一直在尝试使用Pandas处理1.4GB的CSV文件,但是一直存在内存问题。为了让Pandas read_csv无效,我尝试过不同的尝试。

  • 当我使用iterator=Truechunksize=number参数时,它无效。而且,chunksize越小,处理相同数量的数据的速度就越慢。
    • (简单较重的开销并没有解释它,因为当块数很大时它太慢了。我怀疑在处理每个块时,熊猫需要通过它之前的所有块才能“到达它”,而不是直接跳到大块的开头。这似乎是唯一可以解释的方法。)
  • 然后作为最后的手段,我将CSV文件分成6个部分,并尝试逐个读取它们,但仍然得到MemoryError。
    • (我在运行下面的代码时监视了python的内存使用情况,发现每次python完成处理文件并继续下一个文件时,内存使用率都会上升。很明显,熊猫没有当它已经完成处理时,释放前一个文件的内存。)

代码可能没有意义,但那是因为我删除了写入SQL数据库的部分以简化它并隔离问题。

import csv,pandas as pd
import glob
filenameStem = 'Crimes'
counter = 0
for filename in glob.glob(filenameStem + '_part*.csv'): # reading files Crimes_part1.csv through Crimes_part6.csv
    chunk = pd.read_csv(filename)
    df = chunk.iloc[:,[5,8,15,16]]
    df = df.dropna(how='any')
    counter += 1
    print(counter)

3 个答案:

答案 0 :(得分:1)

您可能会尝试仅解析您需要的那些列(如@BrenBarn在评论中所述):

import os
import glob
import pandas as pd

def get_merged_csv(flist, **kwargs):
    return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)

fmask = 'Crimes_part*.csv'
cols = [5,8,15,16]

df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=cols).dropna(how='any')

print(df.head())

PS这将在结果数据框中仅包含至少17列中的4列

答案 1 :(得分:1)

感谢您的回复。

经过一些调试,我找到了问题所在。大熊猫的“iloc”子集创建了一个循环引用,这可以防止垃圾回收。详细讨论可以在here

找到

答案 2 :(得分:0)

我在csv文件中发现了同样的问题。首先将csv作为块并修复chunksize.use chunksize或iterator参数以块的形式返回数据。 语法:

csv_onechunk = padas.read_csv(filepath, sep = delimiter, skiprows = 1, chunksize = 10000)

然后连接块(仅对C解析器有效)