Pandas read_csv()在具有140GB RAM的VM上1.2GB文件内存不足

时间:2016-11-06 20:46:29

标签: python pandas

我正在尝试读取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])

5 个答案:

答案 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")来查找正在数据帧中加载的数据的内存使用情况。

减少内存的几件事:

  1. 仅通过usecols表加载处理中所需的列。
  2. 为这些列设置dtypes
  3. 如果某些列的dtype是Object / String,则可以尝试使用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))