pandas.read_csv读取具有可变长度字符串的文件时变慢

时间:2019-01-22 14:52:36

标签: python pandas csv dataframe

我有一个问题,我认为我已经解决了一些,但我想了解更多或了解更好的解决方案。

问题:我用制表符分隔的文件有约60万行(和一个注释行),其中一个字段(8个字段中的一个)包含一串可变长度的字符串,长度在1到〜2000个字符之间。

使用以下功能读取该文件非常慢:

df = pd.read_csv(tgfile,
                 sep="\t",
                 comment='#',
                 header=None,
                 names=list_of_names)

但是,也许我不太在乎大多数字符串(此字符串的字段名称为'motif'),如果使用时间过长,我可以将其截断

def truncate_motif(motif):
    if len(motif) > 8:
        return motif[:8] + '~'
    else:
        return motif

df = pd.read_csv(tgfile,
                 sep="\t",
                 comment='#',
                 header=None,
                 converters={'motif': truncate_motif},
                 names=list_of_names)

这突然快了很多。

所以我的问题是:

  1. 为什么读取此文件的速度如此慢?它与分配内存有关吗?
  2. 为什么转换器功能在这里有帮助?它必须为每行执行一个附加功能,但是仍然要快很多……
  3. 还有什么可以做的?

1 个答案:

答案 0 :(得分:0)

  1. 您没有提到什么对您来说 slow 意味着什么,但是如果:
    • 您的文件包含约。 60万行,
    • 每行包含1-2000个字符(假设平均为1000,因此每行大约有1000B),

然后此文件的大小是:600 000 * 1000B〜570 MB。很多,尤其是如果您没有太多的RAM内存。

  1. 这很有帮助,因为突然间,一条线的平均大小不是1000B,而是大约1000B。 6-7B(考虑新的最大值= 8B)。系统不会读取并保留整个字符串,而只会检查它们的长度并在需要时进行切割。对我来说听起来很合逻辑!

  2. 在这种情况下,当您必须加载大量数据时,最好使用

for chunk in pd.read_csv(tgfile, chunksize=10000): process(chunk)

chunksize参数表示多少行包含一个块。最好检查一下它是否可以改善您的情况!