2014-01-12 40 views
1

我正在寻找最快的方法,用Java存储大约10亿条记录,每条记录约250字节(存储只会发生一次),然后能够以非连续顺序多次读取它。Java:用于存储和读取10亿条数据记录的最佳方法

源记录正在生成简单的java值对象,我想以相同的格式读回它们。

现在我最好的猜测是在平面文件中使用快速序列化库(如Kryo)存储这些对象,然后使用Java FileChannel直接随机访问以读取文件中特定位置的记录(当存储数据时,我将保存在一个hashmap中(也可以保存在磁盘上),每个记录的文件中的位置,以便我知道在哪里读取它)。

另外,不需要优化磁盘空间。我主要关心的是优化读取性能,同时具有合理的写入性能(即再次仅发生一次)。 最后精确度:虽然记录都是相同类型(相同的Java值对象),但它们的大小(以字节为单位)是可变的(例如它包含字符串)。

有没有比我上面提到的更好的方法?任何暗示或建议将不胜感激!

非常感谢, 托马斯

+1

你有没有考虑将它们放入数据库?这样可以让您以更低的编程成本进行更复杂的索引。 –

+0

对复杂索引没有实际需求:我只需要知道在哪里阅读特定记录(其在文件中的位置永远不会改变)。我的猜测是使用数据库将会慢得多(与数据库通信的开销较大等)。 – Tom

+0

我一直在考虑索引更多的性能,特别是在选择内存中的内容时。 –

回答

1

您可以使用Apache Lucene的,很会照顾你上面:) 它是超级快提到的一切,你可以更快速地搜索结果,然后不断。 Apache Lucene将文件中的对象保存并编入索引。我们已经在几款应用中使用它,而且速度非常快。

+1

+1:这是Lucene的100%匹配。 –

+0

感谢您的建议。阅读描述“Apache LuceneTM是一个高性能,全功能的文本搜索引擎库,完全用Java编写,它几乎适用于任何需要全文搜索的应用程序,尤其是跨平台的应用程序。” =>它似乎与文本相关,而在我的情况下,我正在存储非文本数据+我确切地知道我要阅读哪个记录(不需要复杂的搜索)。我错过了什么吗?任何关于我应该在Apache Lucene中专门寻找的提示?谢谢! – Tom

+0

只需看看网站上提供的演示(http://lucene.apache.org/core/4_6_0/demo/overview-summary.html#overview_description) 其次,你还可以阅读“Lucene in Action”第二版“ 此外,您可以将非文本数据存储在任何位置,但会将其索引(位置,索引,ID)Lucene以非常快的速度获取它。 –

1

您可以使用嵌入式Derby数据库。它是用Java编写的,你可以在你的流程中实际运行它,所以没有进程间或网络通信的开销。它将存储数据并允许您查询/ etc以处理所有复杂性和索引。

+0

谢谢,但嵌入式德比(或H2,甚至更快)需要约200毫秒的简单随机查询。使用我的方法进行的早期测试显示〜1ms为简单的随机查询=>现在我的方法似乎是最快的 – Tom

相关问题