我一直在尝试使用Pandas处理1.4GB的CSV文件,但是一直存在内存问题。为了让Pandas read_csv
无效,我尝试过不同的尝试。
iterator=True
和chunksize=number
参数时,它无效。而且,chunksize
越小,处理相同数量的数据的速度就越慢。
代码可能没有意义,但那是因为我删除了写入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)
答案 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解析器有效)