在Python中使用二叉树进行文件索引?

4 投票
5 回答
2940 浏览
提问于 2025-04-15 18:19

背景

我有很多(成千上万!)的数据文件,这些文件的格式是标准的字段基础格式(可以想象成用制表符分隔,每一行每个文件的字段都一样)。我在考虑各种方法来让这些数据变得可用和可搜索。(一些选项包括关系数据库、NoSQL、使用grep/awk等工具,等等)。

提议

特别是,有一个想法我觉得很有吸引力,那就是以某种方式“索引”这些文件。因为这些文件是只读的(而且是静态的),我想象着可以有一些持久化的文件,里面包含二叉树(每个索引字段一个,就像其他数据存储一样)。我对如何实现这个想法持开放态度,也欢迎听到有人说这根本就是疯狂的想法。主要是,我最喜欢的搜索引擎没有给我找到任何现成的解决方案。

我意识到这个想法有点不成熟,欢迎提供解决方案。

附加细节

  • 文件很长,而不是很宽
    • 每小时有数百万行,分布在每小时100个文件中
    • 用制表符分隔,列不多(大约10列)
    • 字段很短(比如每个字段少于50个字符)
  • 查询是基于字段、字段组合的,可能是历史数据

各种解决方案的缺点:

(这些都是基于我的观察和测试,但我欢迎纠正)

BDB

  • 在处理大文件时有扩展性问题(根据我的经验,一旦文件达到2GB左右,性能可能会很糟糕)
  • 只能有一个写入者(如果有办法绕过这个限制,我想看看代码!)
  • 很难进行多重索引,也就是一次对不同字段进行索引(当然你可以通过不断复制数据来做到这一点)。
  • 因为它只存储字符串,所以需要序列化/反序列化的步骤

关系数据库(RDBMS)

优点:

  • 平坦的表模型非常适合查询和索引

缺点:

  • 根据我的经验,问题出在索引上。从我所见(如果我错了请纠正我),我知道的关系数据库(如sqlite、postgres)要么支持批量加载(然后索引在最后很慢),要么是逐行加载(这很慢)。也许我需要更多的性能调优。

5 个回答

1

如果数据已经整理成了字段,那就不是在做文本搜索或索引的问题了。听起来这更像是表格数据,使用数据库会比较合适。

你可以把文件中的数据导入到数据库里,按照你的需要进行索引,然后用数据库支持的任何复杂方式来查询数据。

当然,如果你是在寻找一个有趣的学习项目,那就可以尝试设计一个有意思的文件索引方案。

1

物理存储的访问时间往往是你做的任何事情中最耗时的。当你进行性能分析时,你会发现大部分时间都花在了 read() 上。

为了减少等待输入输出(I/O)的时间,最有效的方法就是压缩。

把你所有的文件打包成一个巨大的 ZIP 压缩文件。这样只需要一次 open 操作,读取的次数就会减少。虽然你会花更多的 CPU 时间,但 I/O 时间仍然是处理过程中最重要的部分,所以通过压缩所有文件来减少 I/O 时间。

5

为什么要重新发明轮子呢?当然可以对文件进行索引,但可以使用Whoosh或者Lucene等工具。

补充一下:在我发布这个回答时,你并没有说明你的性能需求。用现成的软件是无法做到“每小时索引数百万行”的。

撰写回答