最好将数据存储在RAM,文本文件或数据库中

时间:2013-05-26 18:40:39

标签: database file text words

我正在开发一个项目,我正在使用由向量编码的单词,这些单词大约有2000个浮点数。现在,当我使用原始文本时,我需要检索每个单词的向量,并对其进行一些计算。不用说,对于大词汇量(~100k字),这需要很大的存储空间(文本文件中大约8 GB)。

我最初有一个系统,我将大文本文件拆分为较小的文本,然后对于特定的单词,我读取其文件,并检索其向量。这可能是你想象的那么慢。

我接下来尝试将所有内容读入RAM(大约需要40GB RAM),一旦读完所有内容,就会非常快。但是,读入需要很长时间,缺点是我必须只使用具有足够空闲RAM的某些机器来执行此操作。但是,一旦加载了数据,它就会比其他方法快得多。

我想知道数据库如何与这些方法进行比较。检索将比RAM方法慢,但不会有开销要求。此外,欢迎任何其他想法,我自己也有其他想法(即缓存,使用已将所有内容加载到RAM中的服务器等)。我可能会对数据库进行基准测试,但我想我会在这里发帖,看看其他人有什么要说的。

谢谢!

更新

我使用了Tyler的建议。虽然在我的情况下我不认为BTree是必要的。我只是将这些词和它们的偏移量混为一谈。然后,我可以在运行时查找单词并在其向量中读取。我在文本中缓存了这些单词,因此每个向量只读取一次,但这样可以节省读入和存储不需要的单词的开销,使其优于RAM方法。

仅仅是一个FYI,我使用了Java的RamdomAccessFile类,并使用了readLine(),getFilePointer()和seek()函数。

感谢所有为此主题做出贡献的人。

更新2

要获得更多性能改进,请查看缓冲的RandomAccessFile: http://minddumped.blogspot.com/2009/01/buffered-javaiorandomaccessfile.html

显然,RandomAccessFile的readLine非常慢,因为它逐字节读取。这给了我一些很好的改进。

2 个答案:

答案 0 :(得分:2)

作为一项规则,任何自定义编码的内容都应该比通用数据库快得多,假设您已对其进行了有效编码。

有一些特定的C库可以使用B树来解决这个问题。在过去,有一个名为" B-trieve"这很受欢迎,因为它很快。在这个应用程序中,B-tree比使用数据库愚弄更快更容易。

如果您想获得最佳性能,可以使用称为后缀树的数据结构。有些库旨在创建和使用后缀树。这将为您提供最快的单词查找。

在任何一种情况下,没有理由将整个数据集存储在内存中,只需将带有偏移量的B树(或后缀树)存储到内存中的数据中。这将需要大约3到5兆字节的内存。查询树时,您会得到一个偏移量。然后打开文件,向前搜索偏移量并从磁盘上读取向量。

答案 1 :(得分:1)

您可以使用一个简单的基于文本的索引文件,只是将单词映射到索引,另一个文件只包含每个单词的原始矢量数据。最初,您只需将索引读取到将每个单词映射到数据文件索引并将其保留在内存中的散列映射。如果需要单词的数据,则计算数据文件中的偏移量(2000 * 32 * index)并根据需要进行读取。您可能希望将此数据缓存在RAM中(如果您使用的是java,可能只需使用弱映射作为起点)。

这基本上是实现了你自己的原始数据库,但它仍然可能更好,因为它避免了数据库设置/部署的复杂性。

相关问题