gpt4 book ai didi

database - 最好将数据存储在 RAM、文本文件或数据库中

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:57 25 4
gpt4 key购买 nike

我正在做一个项目,在这个项目中我使用由矢量编码的单词,长度约为 2000 个 float 。现在,当我将这些与原始文本一起使用时,我需要检索遇到的每个单词的向量并对其进行一些计算。不用说,对于大词汇量(~100k 词),这有很大的存储要求(一个文本文件大约 8 GB)。

我最初有一个系统,我将大文本文件拆分成较小的文件,然后针对特定单词,我读取它的文件,并检索它的向量。正如您想象的那样,这太慢了。

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

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

谢谢!

更新

我采纳了 Tyler 的建议。尽管就我而言,我认为 BTree 不是必需的。我只是散列了单词和它们的偏移量。然后我可以查找一个词并在运行时读入它的向量。我缓存了文本中出现的单词,因此每个向量最多只读入一次,但这节省了读入和存储不需要的单词的开销,使其优于 RAM 方法。

仅供引用,我使用了 Java 的 RamdomAccessFile 类并使用了 readLine()、getFilePointer() 和 seek() 函数。

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

更新 2

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

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

最佳答案

通常,任何自定义编码的代码都应该比通用数据库快得多,前提是您已经高效地对其进行了编码。

有特定的 C 库可以使用 B 树解决这个问题。过去有一个著名的库叫做“B-trieve”,因为速度快而非常受欢迎。在此应用程序中,B 树将比使用数据库更快、更容易。

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

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

关于database - 最好将数据存储在 RAM、文本文件或数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16762464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com