我有一个包含一百万个条目的文本文件。每个条目基本上都是几个句子,平均二十个单词。
为了执行一些任务,我将所有单词加载到哈希中。每个单词都是一个键,值将是文本中存在的次数。
我的问题是,将它们加载到哈希中时我的内存不足。我在一台只有1 GB RAM的机器上。有没有办法减少内存使用情况?还是我应该和红宝石hash以外的其他东西一起去。
避免大型内存数据结构
根据定义,内存数据结构使用内存。如果您受到内存约束,请考虑使用数据库或可寻求的磁盘文件以满足您的存储需求。
一些选项
您可能需要查看某种形式的sqlite3,redis或键/值存储。但是,无论您使用什么,想法是将磁盘I/O用于内存消耗。
使用内存树数据结构(trie)
我建议避免使用大型内存数据结构,但是如果您仍然需要/想要使用文本管理大数据结构,您可能会发现有趣的Trie(在节点的后代具有关联的字符串的常见前缀使用该节点)
看一下这些GitHub项目:
- https://github.com/dustin/ruby-trie
- https://github.com/tyler/trie
为什么不使用GDBM?http://ruby-doc.org/stdlib-1.8.6/libdoc/gdbm/rdoc/gdbm.html
是自1.8.6以来标准LIB的一部分。我认为您没有旧版本的Ruby?
如果此文本文件不变(也许即使不是),我建议将其放入sqlite数据库而不是内存哈希。