我应该如何在Delphi中实现一个巨大但简单的索引StringList?

lke*_*ler 4 database delphi

我正在使用Delphi 2009.我有一个非常简单的数据结构,有2个字段:

  1. 一个字符串,它是我需要检索的关键字段,长度通常为4到15个字符.
  2. 一个字符串,它是可以是任意大小的数据字段,从1个字符到10,000个字符.

困难在于我可能有几百万条记录,因此它们的总大小可能超过10 GB.显然,我正在寻找一种磁盘解决方案,而不是内存解决方案.

我的程序需要根据关键字段随机检索这些记录.这就是需要尽可能高效的部分.

我应该将数据库用于这样一个简单的结构吗?如果是这样,哪个数据库最好处理这个并且最简单的实现?

或者,是否有一个简单的磁盘上数据结构,不需要一个完整的数据库,也可以工作?


好吧,我所需要的只是让我回到现实的一个答案.我一直在寻找比简单数据库更简单的东西.但是,如果不使用数据库,那么我意识到我已经用自己对另一个问题的答案回答了这个问题:小应用程序和工具的最佳数据库.

我的回答是DISQLite3我指定有原因.这就是我实施的可能性.


一些可能的更好的答案.那很棒.我将能够尝试一些不同的方法来看看什么效果最好.


更多的考虑,我不得不改变GpStructuredStorage解决方案的接受答案.

就我而言,总计几千兆字节的一百万条记录将对数据库结构造成压力.具体来说,用于在大多数数据库中存储索引的B*树速度很快,但对于某些操作(如重新索引一百万个值)会减慢.

对于索引,你唯一能找到比B*更快的东西就是哈希表.这正是gabr建议添加到GpStructuredStorage解决方案中所提供的内容.我认为它将哈希值分段为一个4级目录结构的方式非常优雅.

我可以使用哈希解决方案的关键原因是我只需要通过密钥随机访问.我不需要按键排序.如果需要排序,则哈希表的速度增益将会丢失,数据库系统将成为无脑的赢家.

当我开始实现这个时,我应该对这个技术与数据库进行比较.也许我会与Firebird和SQLite进行比较,这两者都是值得对手的.


另外一个跟进:

我刚刚发现了A. Bouchez的Synopse Big Table,它专为速度而设计,几乎可以准确地满足我的问题规格.当我在几个月内完成实施时,我会先尝试一下,然后在这里报告我的结果.


稍后的后续(2015年7月)

我从未尝试过Synopse Big Table.到目前为止,我一直坚持使用我的B*树.但现在我升级到Delphi XE8并计划使用FireDAC和SQLite来使用数据库解决方案.

Ken*_*ite 5

对于超过10GB的数据,数据库正是您所需要的.它将处理快速定位数据的索引(随机检索),添加,修改和删除数据的功能,以及实际存储,以及更多选择.

这里有几十个与Delphi中可用的数据库相关的帖子,包括内置插件和Firebird等FOS .

  • @Larry:支持不需要的功能不会带走任何东西.但是,在编写"简单"的磁盘数据结构时,成熟的数据库系统可能已经投入了大量的工作,而不是单独可以实现的文件访问和缓存策略.为什么不利用它呢? (2认同)

lke*_*ler 1

A. Bouchez《大桌子》剧情简介。请参阅他对我有关 SQLite/DISQLite 的其他问题的回答

当我第一次问这个问题时它甚至还没有开发出来,但现在它是一个相当成熟且功能齐全的单元。