Python Pandas在内存为140GB的VM上读取1.2GB的文件
我试图读取一个1.2G的CSV文件,其中包含25K条记录,每条记录由一个id和一个大字符串组成 但是,在大约10K行中,我得到了以下错误: pandas.io.common.CParserError:标记数据时出错。C错误:内存不足 这看起来很奇怪,因为虚拟机有140GB的RAM,在10K行时,内存使用率仅为~1% 这是我使用的命令:Python Pandas在内存为140GB的VM上读取1.2GB的文件,python,pandas,Python,Pandas,我试图读取一个1.2G的CSV文件,其中包含25K条记录,每条记录由一个id和一个大字符串组成 但是,在大约10K行中,我得到了以下错误: pandas.io.common.CParserError:标记数据时出错。C错误:内存不足 这看起来很奇怪,因为虚拟机有140GB的RAM,在10K行时,内存使用率仅为~1% 这是我使用的命令: pd.read_csv('file.csv', header=None, names=['id', 'text', 'code']) 我还运行了下面的虚拟程序,
pd.read_csv('file.csv', header=None, names=['id', 'text', 'code'])
我还运行了下面的虚拟程序,它可以成功地将我的内存填充到接近100%
list = []
list.append("hello")
while True:
list.append("hello" + list[len(list) - 1])
这听起来像是
chunksize
的工作。它将输入过程分成多个块,减少了所需的读取内存
df = pd.DataFrame()
for chunk in pd.read_csv('Check1_900.csv', header=None, names=['id', 'text', 'code'], chunksize=1000):
df = pd.concat([df, chunk], ignore_index=True)
此错误可能发生在无效的csv文件中,而不是声明的内存错误 我在一个比可用RAM小得多的文件中遇到了这个错误,结果是在一行上有一个开始的双引号,而没有结束的双引号 在这种情况下,您可以检查数据,也可以更改解析器的引用行为,例如通过将
quoting=3
传递到pd.read_csv
这很奇怪
事实上,我遇到了同样的情况
df_train = pd.read_csv('./train_set.csv')
但是在我尝试了很多东西来解决这个错误之后。它是有效的。
像这样:
dtypes = {'id': pd.np.int8,
'article':pd.np.str,
'word_seg':pd.np.str,
'class':pd.np.int8}
df_train = pd.read_csv('./train_set.csv', dtype=dtypes)
df_test = pd.read_csv('./test_set.csv', dtype=dtypes)
或者这个:
ChunkSize = 10000
i = 1
for chunk in pd.read_csv('./train_set.csv', chunksize=ChunkSize): #分块合并
df_train = chunk if i == 1 else pd.concat([df_train, chunk])
print('-->Read Chunk...', i)
i += 1
但是!!!!!突然,原来的版本也很好用
就像我做了一些无用的工作,但我仍然不知道哪里出了问题
我不知道该说什么。您可以使用命令
df.info(memory\u usage=“deep”)
来了解数据帧中加载的数据的内存使用情况
减少内存的几件事:
usecols
表加载处理中需要的列d类型
dtype=“category”
。根据我的经验,它大大减少了内存的使用我使用以下代码分块加载csv,同时删除中间文件以管理内存,并实时查看加载的百分比: 注意:96817414是我的csv中的行数
import pandas as pd
import gc
cols=['col_name_1', 'col_name_2', 'col_name_3']
df = pd.DataFrame()
i = 0
for chunk in pd.read_csv('file.csv', chunksize=100000, usecols=cols):
df = pd.concat([df, chunk], ignore_index=True)
del chunk; gc.collect()
i+=1
if i%5==0:
print("% of read completed", 100*(i*100000/96817414))
您是否尝试使用
chunksize
参数并以块的形式读取文件?@MaxU然后它将返回一个迭代器,我必须在我的代码中处理该迭代器,如果可能,我将在循环中将每个块连接到结果DF:DF=pd.DataFrame();对于pd.read_csv(…):df=pd.concat([df,x],ignore_index=True)
-因此我们不需要所有块都使用RAM,再加上生成的DFWow,nice:)谢谢,它工作得很好。您现在知道了吗,为什么最初的方法失败了?@DavidFrank您最初没有将文件分割成块,导致读取文件需要太多内存。由于内存限制,读取较小的数据块是可行的。@kilojoules但我的内存是文件所需的100多倍,开销从何而来?@DavidFrank,你的pandas版本是什么?我也面临着类似的不一致性挫折。然而,由于这是一个内存错误,所以当错误发生时,它可能是不一致的。例如,您不知道正在运行的外部进程可能会占用内存,或者可能是垃圾收集器在成功的时候决定收集。我仍然认为最好采用更安全的方法,使用您发现的减少内存消耗的方法之一,以避免将来出现错误。所以我不认为你的工作被浪费了。