我应该将文件保存为文本还是导入数据库?

时间:2009-04-01 02:26:27

标签: ruby-on-rails sqlite

我正在构建一个anagram生成器,它是一个编码练习,并使用一个大约633,000行的单词列表(每行一个单词)。我最初只用Ruby编写程序,我想修改它以在线部署它。

我的托管服务支持Ruby on Rails,这是唯一基于Ruby的解决方案。我想在我自己的机器上托管,并使用较小的框架,但我现在不想处理安全问题。

我只将RoR用于数据库驱动(CRUD)应用程序。但是,我从未以这种方式填充sqlite数据库,因此这是一个由两部分组成的问题:

1)我应该将其导入数据库吗?如果是这样,最好的方法是什么?如果是这样的话,我想坚持使用sqlite来保持简单。

2)'平面文件'更好吗?我不会做任何创建或更新,只是检查单词列表。

谢谢。

3 个答案:

答案 0 :(得分:2)

如何将它保存在记忆中?存储许多单词只占用几兆字节的RAM,否则你将经常访问该文件,因此它可能会被缓存。将单词列表保存在内存中的优点是,您可以在任何最适合您需求的数据结构中组织它(我正在考虑一个特里)。如果您无法节省大量内存,那么使用数据库可能对您有利,因此您可以有效地仅加载任何给定查询所需的单词列表部分 - 当然,在这种情况下,您需要创建一些索引列(至少一个),这样您就可以利用SQL的索引功能。

答案 1 :(得分:0)

假设您正在查找列表中是否存在单词,我会说具有索引列的SQLite可能比线性扫描单词列表更快。现在,如果您当前的方法足够快,那么我认为没有理由将其移植到数据库;就你而言,这只是一个令人头痛的问题。如果您看到搜索时间成为负担,那么将其转储到索引数据库中将是一个好主意。

您可以使用以下架构创建表:

CREATE TABLE words (
       word text primary key
);

CREATE INDEX word_idx ON words(word);

使用以下内容导入您的数据:

sqlite words.db < schema.sql
while read word 
do 
   sqlite3 words.db "INSERT INTO words values('$word');"
done < words.txt

答案 2 :(得分:0)

我会因为上面列出的原因跳过数据库。内存中的简单哈希将在数据库中执行与查找一样快的速度。

即使数据库查找速度稍慢,您仍然在浪费时间,数据库必须解析查询并为查找创建计划,然后汇总结果并将其发送回您的程序。另外,你可以为自己节省依赖。

如果您计划将程序的其他部分移动到持久性存储,那么请继续使用。但是hashmap应该足以供您使用。