我尝试过PostgreSQL、MySQL、Kyoto Cabinet(通过细微调整)与Protostuff编码。
SQL数据库(带索引)执行最简单的查询都要花费很长时间。
Kyoto Cabinet的B-Tree可以处理1500万至1800万条记录,超过这个数量后,追加操作会变得非常缓慢。
我已经厌倦了这些问题,正在考虑回到awk + CSV,我记得它曾经可以处理这种类型的数据。
我尝试过PostgreSQL、MySQL、Kyoto Cabinet(通过细微调整)与Protostuff编码。
SQL数据库(带索引)执行最简单的查询都要花费很长时间。
Kyoto Cabinet的B-Tree可以处理1500万至1800万条记录,超过这个数量后,追加操作会变得非常缓慢。
我已经厌倦了这些问题,正在考虑回到awk + CSV,我记得它曾经可以处理这种类型的数据。
对于顺序读写,leveldb 可以很好地处理您的数据集。
Ferdinand Prantl的回答非常好。两点:
我觉得那个表大约有48吉字节的数据。
当你涉及到大型数据库时,你必须以不同的方式来看待问题。对于普通的数据库(比如说,表少于几百万行),你可以做任何概念验证。即使你对SQL数据库、服务器调优和硬件调优一无所知,你得出的答案可能也是正确的。(尽管有时候你可能因为错误的原因而得出正确的答案。)
但对于大型数据库来说,情况通常并非如此。
不幸的是,你不能仅仅将15亿行数据直接扔给一个未经调优的PostgreSQL服务器,运行几个查询,然后说:“PostgreSQL处理不了这个。”大多数SQL数据库管理系统都有处理大量数据的方法,而大多数人对此并不了解。
以下是我在长期处理大量数据时需要考虑的一些事项。(对于短期或一次性处理,速度通常不值得过多关注。很多公司甚至不会为长期解决方案投资更多的内存或十几块高速硬盘,甚至连几个固态硬盘都不会。)
我确定还有其他的,但我还没喝咖啡。
但重点是,除非你考虑了所有这些优化的影响,否则无法确定例如PostgreSQL是否能处理一个48GB的表。对于大型数据库,你要依赖于小改进的累积效果。在你能够有力地得出某个特定的数据库管理系统无法处理一个48GB的表的结论之前,你必须进行大量的测试。
现在,你能否实施这些优化是一个不同的问题 - 大多数公司不会投资于新的64位服务器运行Oracle和十几个最新的“我是最快的硬盘”硬盘来解决你的问题。
long
的大小是多少?是32位还是64位? - Joachim Isakssonseek(key*32); read(32 bytes);
来解决你的问题。 - Joachim Isaksson