如何存储15 x 1亿个32字节记录以进行顺序访问?

时间:2012-03-18 08:43:15

标签: sql database nosql

我获得了15 x 1亿32字节的记录。只需要顺序访问和追加。关键是龙。值是元组 - (日期,双精度,双精度)。这宇宙中有什么东西可以做到这一点吗?我愿意为这些1亿条记录中的每条记录提供15个单独的数据库(sql / nosql)或文件。我只有一个i7内核和8 GB RAM和2 TB硬盘。

我尝试过使用Protostuff编码的PostgreSQL,MySQL,Kyoto Cabinet(带微调)。

SQL DB(带索引)需要永远进行最愚蠢的查询。

京都内阁的B-Tree可以处理多达1500万到1,800万条记录,超出这些记录将永久保留。

我厌倦了以至于我想回到awk + ​​CSV,我记得曾经为这类数据工作过。

4 个答案:

答案 0 :(得分:2)

如果你的场景意味着总是按顺序遍历所有记录,那么使用数据库可能会有些过分。如果您开始需要随机查找,替换/删除记录或检查新记录是否与旧记录重复,则数据库引擎会更有意义。

对于顺序访问,一些文本文件或手工制作的二进制文件将更容易处理。你听起来像一个开发人员 - 我可能会采用自己的二进制格式,并在内存映射文件的帮助下访问它,以提高顺序读取/追加速度。没有缓存,只是一个读取数据的滑动窗口。我认为它会比任何DB都更好,甚至在通常的硬件上也能表现得更好;我曾做过一次这样的数据分析。它也比唤醒CSV文件更快;但是,首先,我不确定开发二进制存储的工作量是否满足。

只要数据库变得有趣,您就可以查看MongoDBCouchDB。它们用于存储和提供非常大量数据。 (有一个flattering evaluation将其中一个与传统数据库进行比较。)数据库通常需要合理的硬件功能才能更好地运行;也许你可以看看这两者对你的数据有何影响。

---费达

答案 1 :(得分:1)

Ferdinand Prantl的回答非常好。两点:

  • 根据您的要求,我建议您创建一个非常紧凑的二进制格式。这很容易做到,因为您的记录是固定大小。
  • 如果您能够很好地理解您的数据,那么您可以将其压缩。例如,如果您的密钥是增加的日志值,则无需完全存储它。相反,将差异存储到之前的值(几乎总是一个)。然后,使用标准压缩算法/库来节省数据大小的时间。

答案 2 :(得分:1)

对于顺序读取和写入,leveldb将很好地处理您的数据集。

答案 3 :(得分:0)

我认为在一个表格中大约有48个数据。

当你进入大型数据库时,你必须以不同的方式看待事物。使用普通数据库(例如,表格少于几百万行),您可以做任何事情作为概念证明。即使你对SQL数据库,服务器调优和硬件调优一无所知,你提出的答案可能也是正确的。 (虽然有时你可能出于错误的原因。)

大型数据库通常不会这样。

不幸的是,你不能直接在未经调整的PostgreSQL服务器上抛出15亿行,运行几个查询,并说“PostgreSQL无法处理这个问题。”大多数SQL dbms都有处理大量数据的方法,大多数人对它们了解不多。

以下是我必须长期处理大量数据时需要考虑的一些事项。 (短期或一次性处理,通常不值得关注速度。许多公司不会投资更多RAM或十几个高速磁盘 - 甚至是几个SSD - 甚至一个长期的解决方案,更不用说一次性工作了。)

  • 服务器CPU。
  • 服务器RAM。
  • 服务器磁盘。
  • RAID配置。 (RAID 3可能值得为你看。)
  • 操作系统的选择。 (64位与32位,BSD对AT& T衍生物)
  • DBMS的选择。 (Oracle通常会优于PostgreSQL,但需要花费。)
  • DBMS调整。 (共享缓冲区,排序内存,缓存大小等)
  • 选择索引和聚类。 (现在有很多不同的种类。)
  • 规范化。 (你会惊讶地发现,5NF的表现通常比较低的NF更高。同样适用于自然键。)
  • 表空间。 (也许在自己的SSD上放一个索引。)
  • 分区。

我确定还有其他人,但我还没喝咖啡。

但关键是你无法确定PostgreSQL是否可以处理48 gig表,除非你已经考虑了所有这些优化的效果。对于大型数据库,您可以依靠小改进的累积效果。您必须先进行大量测试,然后才能确定某个给定的dbms无法处理48个gig表。

现在,您是否可以实施这些优化是一个不同的问题 - 大多数公司都不会投资运行Oracle的新64位服务器以及最新的十几个“我是最快的硬盘“硬盘驱动器来解决您的问题。

但某人 要为最佳硬件和软件,dba调整专业知识,或程序员时间以及等待次优硬件付费。我已经看到这样的问题需要数月才能解决。如果需要几个月的时间,硬件上的资金可能是一项明智的投资。