我有一个问题,我认为我已经解决了一些问题,但我想了解更多相关信息或了解更好的解决方案。
问题:我有大约 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)
这突然快了很多。
所以我的问题是:
- 为什么读取这个文件这么慢?是否与分配内存有关?
- 为什么转换器函数在这里有帮助?它必须为每一行执行一个附加函数,但仍然快得多...
- 还能做什么?
最佳答案
- 您没有提到对您来说慢意味着什么,但是如果:
- 您的文件包含 ca. 60 万行,
- 每行包含 1-2000 个字符(假设平均 1000 个,因此每行大约有 1000B),
则此文件的大小为:600 000 * 1000B ~ 570 MB。很多,特别是如果您没有太多 RAM 内存。
这很有帮助,因为突然间一行的平均大小不是 1000B,而是大约 1000B。 6-7B(考虑新的最大值 = 8B)。该系统不会读取和保留整个字符串,而只会检查它们的长度并在需要时进行剪切。对我来说听起来很合乎逻辑!
在这种情况下,当您必须加载大量数据时,最好使用 block 。
对于 pd.read_csv 中的 block (tgfile,chunksize=10000):
进程( block )
chunksize
参数表示一个 block 包含多少行。最好检查它是否提高了您的案例的性能!
关于python - 读取具有可变长度字符串的文件时,pandas.read_csv 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54310872/