- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在做一个项目,在这个项目中我使用由矢量编码的单词,长度约为 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/
所以这只是一个好奇的问题。 如果我想退回单位,哪个更好? |> ignore 或者 () 应该还有其他方法。考虑到这些,我只想知道什么是最好的: 什么是性能最高的 生产环境的最佳实践是什么 什么是长期
我如何(最好)将方法调用返回的Option转换为Try(通过首选项,尽管Either或scalaz \/甚至是Validation都可以),包括在适当时指定Failure值? 例如,我有以下代码,虽然
我读了第一本关于 C# 的书,但对 LINQ 完全一无所知。请推荐对读者友好的 linq Material 。 谢谢 最佳答案 LINQ in Action已经有好几个人向我推荐了。 关于c# - 从
这个问题已经有答案了: How to create a template in HTML? (3 个回答) 已关闭 7 年前。 我正在寻找一种将一个 html 文件包含在另一个 html 文件中的最佳
我有一个在线注册,可以将数据保存到托管的 mssql 数据库中......基本上我想做的是在本地服务器上运行日常例行程序,就像 Insert into Home.tableA Select * fro
我有文本文件要加载到数据框中。加载后,这些值都在一列中,格式如下: 0 Alabama[edit] 1 Auburn (something somethign) 2 Florence (somethi
例如:我有一个带有外键的“历史”表,它可能根据字段值指向不同的表/实体。 表历史: create table history( id int PimaryKey AUTO_INC, e
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我有业务对象(DEVELOPERS WRITE)和一些 SPROCS(DBA WRITE) 谁能推荐一个好的对象映射器来处理这种设置。 我尝试了 codesmith 和 nhibernate,但遇到了
我应该测试 if 某事是否有效,还是只测试 try 来执行它并捕获异常? 是否有任何可靠的文档表明首选一种方法? 还有一种方式 pythonic? 例如,我应该: if len(my_list) >=
在 Java 中遍历字符串字符的一些方法是: 使用 StringTokenizer? 将 String 转换为 char[] 并对其进行迭代。 最简单/最好/最正确的迭代方式是什么? 最佳答案 我使用
我是一个真正的 Erlang 新手(1 周前开始),我正在尝试通过创建一个小而高效的聊天服务器来学习这种语言。 (当我说高效时,我的意思是我有 5 台服务器用于对数十万连接的客户端进行压力测试 - 一
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 5 年前。 我正在使用 NPM 包 prompt
到目前为止我已经做了一些测试(例如 RPC)接下来我来到多分页部分,到目前为止我读到的内容中有很多选项: MVP、布局、UIbind。 现在我真的不知道该选择哪个,哪个既简单又好。 我尝试清除我的根面
我们正在寻找我们能找到的最好的基于 jQuery 的用户界面库。它不一定是免费的。人们在使用什么? 我们使用过jQueryUI ,但发展似乎已经停滞。很长一段时间以来没有太多新东西。 jQuery T
我是 OpenCL 编程的初学者。我的 PC 装有 Windows 8.1,配备英特尔显卡和 AMD Radeon 7670。当我搜索下载 OpenCL SDK 和示例 helloworld 程序时,
我从人们那里得到的印象是...除非与 process.nextTick 一起使用,否则所有 JavaScript 函数都是同步的。什么时候使用它最好? 我想确保我不会在不需要它的地方过度使用它。在这一
我有一个单词列表,我想对其进行过滤,这样我就只有该单词列表中的名词(使用 Java)。为此,我正在寻找一种简单的方法来查询单词数据库的类型。 我的问题是有没有人知道一个免费、简单的单词查找 API,它
我想开发一个新的 iPhone 应用程序,我之前开发了一个应用程序,但被应用程序商店拒绝了,因为我使用的 StoryBoard 在之前的 iOS 4.3 中不起作用,所以我改用了 XIB。 现在最低版
我正在尝试制作注册表,我只想在其中注册特定域的电子邮件。例如我只想注册来自 companyX、companyY、companyZ 的电子邮件。 因此可接受的电子邮件将是:- myname@compan
我是一名优秀的程序员,十分优秀!