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

标签 python pandas csv dataframe

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

问题:我有大约 600k 行(和一个注释行)的制表符分隔文件,其中一个字段(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. 您没有提到对您来说意味着什么,但是如果:
    • 您的文件包含 ca. 60 万行,
    • 每行包含 1-2000 个字符(假设平均 1000 个,因此每行大约有 1000B),

则此文件的大小为:600 000 * 1000B ~ 570 MB。很多,特别是如果您没有太多 RAM 内存。

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

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

对于 pd.read_csv 中的 block (tgfile,chunksize=10000): 进程( block )

chunksize 参数表示一个 block 包含多少行。最好检查它是否提高了您的案例的性能!

关于python - 读取具有可变长度字符串的文件时,pandas.read_csv 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310872/

相关文章:

python - 如何在网速慢时停止pyautogui并恢复之前的程序代码

python - Pandas 按三列分组,但保留所有其他列

python - 打开包含未定义字符的文件(csv.gz)并将文件传递给函数

python - 将 csv 导入 pandas 数据框时不读取所有行

sql-server - Powershell函数将csv文件导入SQL Server数据库表

python - 运行命令 : ls -l . '{' 不被识别为内部或外部命令、可运行程序或批处理文件

python - 如何使用 xPath 获取 </ul> 和 <p> 之间的文本?

python+加密: Encrypting session key using public key

python - np.where 与日期时间产生 Unix 时间戳

python - 包含分类数据和数值数据的 Pandas 条形图