我正在尝试读取1.2G的CSV文件,其中包含25K条记录,每条记录包含一个id和一个大字符串。
但是,大约10K行,我收到此错误:
pandas.io.common.CParserError:标记数据时出错。 C错误:内存不足
这看起来很奇怪,因为VM有140GB内存和10K行,内存使用率仅为~1%。
这是我使用的命令:
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])
答案 0 :(得分:4)
这听起来像是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)
答案 1 :(得分:1)
无效的csv文件可能会发生此错误,而不是指定的内存错误。
我收到的错误是一个比我的可用内存小得多的文件,结果发现在一行上有一个开头的双引号没有结束双引号。
在这种情况下,您可以检查数据,也可以更改解析器的引用行为,例如将quoting=3
传递给pd.read_csv
。
答案 2 :(得分:0)
这很奇怪。
实际上我遇到了同样的情况。
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
但是!!!突然之间,原始版本也能正常工作!
就像我做了一些没用的工作,但我仍然不知道哪里出了问题。
我不知道该怎么说。
答案 3 :(得分:0)
您可以使用命令df.info(memory_usage="deep")
来查找正在数据帧中加载的数据的内存使用情况。
减少内存的几件事:
usecols
表加载处理中所需的列。dtypes
dtype="category"
。以我的经验,它可以大大减少内存使用量。答案 4 :(得分:0)
我使用下面的代码以大块方式加载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))