大文件定位某一行?

2017-08-22 19:13:37 +08:00
 kaiser1992
现有一个很大的文件(比如 40G 的文本),假如我随机定位某一行,怎么样实现最快(时间和空间)?
希望 V 友们想什么说什么,畅所欲言
8706 次点击
所在节点    程序员
81 条回复
wangyucn
2017-08-23 08:41:57 +08:00
囧,正在编辑不小心发出去了。凑合看吧。 索引做成外挂式的,不需要改原文件。
90safe
2017-08-23 08:53:34 +08:00
grep 是个黑科技
huangfs
2017-08-23 09:14:46 +08:00
rg
kaiser1992
2017-08-23 09:24:53 +08:00
@wangyucn 谢谢,前期构建索引需要遍历字符位置,感觉太耗时间了
kaiser1992
2017-08-23 09:29:38 +08:00
@lululau 换行符都是\n 或者\r\n 相同符号如何构建索引?
kaiser1992
2017-08-23 09:33:46 +08:00
@lululau 我明白你意思了,你是要对每一行换行符的位置做一个索引
Hozzz
2017-08-23 09:43:37 +08:00
还不如将整个文件先拆成多个小文件,然后再并行查询(如果是构建索引,遇到频繁更新的文件,效率仍然不高)
kaiser1992
2017-08-23 09:50:01 +08:00
@Hozzz 不考虑并行的方式,拆分重写小文件,需要的时间也不少,还没有考虑之后查询的时间。
mhycy
2017-08-23 09:54:18 +08:00
楼上有人提到并行,但实际应用中可行性不大,因为数据是从磁盘顺序读取的。

构建索引只需要记录所有\r\n or \n 的偏移量,构建时间约等于读取 40G 文件所需的时间。
(如果 CPU 足够快的话)

如果 CPU 在判断字符过程中消耗过大(基本不可能,除非 IO 太快)
那么可考虑缓冲区读取多线程并行分析,但考虑到多线程开销,似乎还是单线程更靠谱。

注意:因为 IO 的限制,没有比这个更快的定位不定长数据行的办法。
xou130
2017-08-23 09:56:03 +08:00
40G 这个大小该上 hadoop 了
qian19876025
2017-08-23 10:07:24 +08:00
@Fishdrowned 不管你怎么样你翻书还是串行的 除非读进内存你这就是延迟而已
luoqeng
2017-08-23 10:15:33 +08:00
vjnjc
2017-08-23 10:39:18 +08:00
借楼问一下中文件你们都是怎么操作的?
有一个 sql 文件,大概 100MB,我在 mac 下用 vim 打开都花了一分钟了。。。
Hozzz
2017-08-23 10:47:04 +08:00
@kaiser1992 可以在存入文件之前就对数据进行拆分,或者用个额外的进程不停对该文件进行拆分
Hozzz
2017-08-23 10:51:23 +08:00
@kaiser1992 另外 head 和 tail 命令不会遍历整个文件
Fishdrowned
2017-08-23 11:13:09 +08:00
@qian19876025 #51 麻烦你了解一下磁盘寻址,我已经知道某行的偏移量在哪里了,找个 offset 还要串行?
Fishdrowned
2017-08-23 11:16:05 +08:00
@kaiser1992 #44 这个时间(遍历整个文件)是必须付出的,没有捷径。
realpg
2017-08-23 11:21:58 +08:00
@vjnjc #53
你只是需要一个对大文件友好的编辑器

一个 10G 文本 windows 下用普通编辑器打开可能用好久,用 ultraedit 之类基本秒开,他是部分读取缓冲区的
v2orz
2017-08-23 11:46:02 +08:00
6 楼+16 楼应该已经可以解决问题了
popok
2017-08-23 11:47:29 +08:00
传说中的社工库吗

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

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

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

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

© 2021 V2EX