Python Pandas在内存为140GB的VM上读取1.2GB的文件

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']) 我还运行了下面的虚拟程序,

我试图读取一个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'])
我还运行了下面的虚拟程序,它可以成功地将我的内存填充到接近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类型
  • 如果某些列的数据类型为Object/String,则可以尝试使用
    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版本是什么?我也面临着类似的不一致性挫折。然而,由于这是一个内存错误,所以当错误发生时,它可能是不一致的。例如,您不知道正在运行的外部进程可能会占用内存,或者可能是垃圾收集器在成功的时候决定收集。我仍然认为最好采用更安全的方法,使用您发现的减少内存消耗的方法之一,以避免将来出现错误。所以我不认为你的工作被浪费了。