请教 Python 大佬,遍历一个 5GB 大小的 txt 文件,用什么方式效率比较高

2022-07-22 20:09:29 +08:00
 ranxi

python 新手,现在有个需求,大概几百万条数据需要翻译,映射关系存在一个 5GB 左右大小的 txt 文件里,也就是拿几百万个值去几亿条数据里去匹配,怎么做比较好

4675 次点击
所在节点    程序员
35 条回复
jarence
2022-07-22 20:19:08 +08:00
介绍的太笼统了,匹配是怎么匹配的?
HankLu
2022-07-22 20:19:38 +08:00
社工库?
Richard14
2022-07-22 20:20:28 +08:00
5GB 不大,全部载入内存也能抗
如果是 500G 的话就要建立索引了,可以考虑使用数据库。不过无论如何如果要大量随机读写的话效率不会很美丽就是了
rushpu
2022-07-22 21:22:18 +08:00
可以用 dask.bag.read_text
https://examples.dask.org/bag.html
VincentYoung
2022-07-22 21:36:54 +08:00
之前搞过这个。你不要 readlines 会卡死,readline 就行。建议切成 5 个 1G 的文件,这样效率更高。
VincentYoung
2022-07-22 21:37:54 +08:00
用的数据库是 clickhouse ,查询速度还是挺快。
ranxi
2022-07-22 21:46:31 +08:00
@jarence 两个文件 O1 和 O2 ,可以理解成两张表,每行\t 分隔,O1 每行是 a ,b ,c ,其中 c 需要映射成另一个值 d ,这个映射关系在 O2 文件里( c ,d ),O2 文件大概有 5GB ,几亿行数据。
ranxi
2022-07-22 21:48:01 +08:00
@Richard14 试了下 pandas ,查一次要 3 ,4 秒,查几百万次完全查不动啊
ranxi
2022-07-22 21:49:02 +08:00
暂不考虑数据库
Juszoe
2022-07-22 21:52:02 +08:00
对 O2 建哈希表完事了,5 个 G 绰绰有余
liuhan907
2022-07-22 22:30:59 +08:00
这么朴素的任务弄个 hash 表不就完了。啥你说内存不够,不够就加。内存多便宜.
blankmiss
2022-07-22 22:33:07 +08:00
@ranxi 给个模拟数据
ytmsdy
2022-07-22 22:47:06 +08:00
清洗出来,自己先按照数据的逻辑做一个大的基本划分,然后丢到 pandas !
SenLief
2022-07-22 22:47:46 +08:00
多加几根内存条就可以吧? 5g 不是很大
liprais
2022-07-22 22:52:32 +08:00
整到 sqlite 里
一个 join 完事
有你问的时间都跑完了
ranxi
2022-07-22 23:05:35 +08:00
@liprais 用不了 sql
ranxi
2022-07-22 23:11:53 +08:00
O1 按需求是要逐行读取的,所以只能对 O2 操作。我明天试试 hash 表吧
wxf666
2022-07-22 23:49:08 +08:00
@ranxi 按理说你都能用 python 了,sqlite 是内置的标准库,应该是用得了的

# 根据 O2 构造 hash 表(字典)
with open(r'O2.txt', encoding='utf-8') as fp:
   table = dict((row.split('\t') for row in fp))

# O1 逐行替换并输出
with open(r'O1.txt', encoding='utf-8') as in_fp, open(r'out.txt', 'w', encoding='utf-8') as out_fp:
   for row in in_fp:
     cols = row.split('\t')
     cols[2] = table[cols[2].rstrip('\n')]
     out_fp.write('\t'.join(cols))

内存若不够,考虑构造 hash 表时,仅将 hash(str) 作为键名,然后 cols[2] = table[hash(cols[2].rstrip('\n'))] ?
Trim21
2022-07-23 04:03:25 +08:00
说不定 python 编译的时候没带 SQLite 🐶
renmu123
2022-07-23 08:41:33 +08:00
扔哈希或者 Redis 里再查

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX