在Python中使用二叉树进行文件索引?
背景
我有很多(成千上万!)的数据文件,这些文件的格式是标准的字段基础格式(可以想象成用制表符分隔,每一行每个文件的字段都一样)。我在考虑各种方法来让这些数据变得可用和可搜索。(一些选项包括关系数据库、NoSQL、使用grep/awk等工具,等等)。
提议
特别是,有一个想法我觉得很有吸引力,那就是以某种方式“索引”这些文件。因为这些文件是只读的(而且是静态的),我想象着可以有一些持久化的文件,里面包含二叉树(每个索引字段一个,就像其他数据存储一样)。我对如何实现这个想法持开放态度,也欢迎听到有人说这根本就是疯狂的想法。主要是,我最喜欢的搜索引擎没有给我找到任何现成的解决方案。
我意识到这个想法有点不成熟,欢迎提供解决方案。
附加细节
- 文件很长,而不是很宽
- 每小时有数百万行,分布在每小时100个文件中
- 用制表符分隔,列不多(大约10列)
- 字段很短(比如每个字段少于50个字符)
- 查询是基于字段、字段组合的,可能是历史数据
各种解决方案的缺点:
(这些都是基于我的观察和测试,但我欢迎纠正)
BDB
- 在处理大文件时有扩展性问题(根据我的经验,一旦文件达到2GB左右,性能可能会很糟糕)
- 只能有一个写入者(如果有办法绕过这个限制,我想看看代码!)
- 很难进行多重索引,也就是一次对不同字段进行索引(当然你可以通过不断复制数据来做到这一点)。
- 因为它只存储字符串,所以需要序列化/反序列化的步骤
关系数据库(RDBMS)
优点:
- 平坦的表模型非常适合查询和索引
缺点:
- 根据我的经验,问题出在索引上。从我所见(如果我错了请纠正我),我知道的关系数据库(如sqlite、postgres)要么支持批量加载(然后索引在最后很慢),要么是逐行加载(这很慢)。也许我需要更多的性能调优。
5 个回答
1
如果数据已经整理成了字段,那就不是在做文本搜索或索引的问题了。听起来这更像是表格数据,使用数据库会比较合适。
你可以把文件中的数据导入到数据库里,按照你的需要进行索引,然后用数据库支持的任何复杂方式来查询数据。
当然,如果你是在寻找一个有趣的学习项目,那就可以尝试设计一个有意思的文件索引方案。
1
物理存储的访问时间往往是你做的任何事情中最耗时的。当你进行性能分析时,你会发现大部分时间都花在了 read()
上。
为了减少等待输入输出(I/O)的时间,最有效的方法就是压缩。
把你所有的文件打包成一个巨大的 ZIP 压缩文件。这样只需要一次 open
操作,读取的次数就会减少。虽然你会花更多的 CPU 时间,但 I/O 时间仍然是处理过程中最重要的部分,所以通过压缩所有文件来减少 I/O 时间。