Должен ли я сохранить файл в виде текста или импортировать в базу данных? - PullRequest
1 голос
/ 01 апреля 2009

Я создаю генератор анаграммы, который был упражнением по кодированию, и использую список слов длиной около 633 000 строк (одно слово в строке). Первоначально я написал программу только на Ruby, и я хотел бы изменить ее, чтобы развернуть в Интернете.

Моя служба хостинга поддерживает Ruby on Rails как почти единственное решение на основе Ruby. Я думал о хостинге на своей машине и об использовании меньшего фреймворка, но сейчас я не хочу заниматься вопросами безопасности.

Я использовал RoR только для приложений на основе базы данных (CRUD). Однако я никогда не заполнял базу данных sqlite таким образом, так что это вопрос из двух частей:

1) Должен ли я импортировать это в базу данных? Если да, то какой метод лучше всего для этого сделать? Я хотел бы придерживаться sqlite для простоты, если это так.

2) «Плоский файл» лучше? Я не буду создавать или обновлять, просто проверяю список слов.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2009

Как насчет хранения в памяти? Хранение такого количества слов заняло бы всего несколько мегабайт оперативной памяти, в противном случае вы бы часто обращались к файлу, так что, возможно, он все равно был бы кэширован. Преимущество сохранения списка слов в памяти состоит в том, что вы можете организовать его в любой структуре данных, которая наилучшим образом соответствует вашим потребностям (я думаю, что это очень удобно). Если вы не можете сэкономить столько памяти, вам может быть выгодно использовать базу данных, чтобы вы могли эффективно загружать только те части списка слов, которые нужны для любого запроса - конечно, в этом случае вы захотите создайте несколько столбцов индекса (по крайней мере, один), чтобы вы могли воспользоваться возможностями индексации SQL.

0 голосов
/ 01 апреля 2009

Я бы пропустил базу данных по причинам, указанным выше. Простой хеш в памяти будет выполнять примерно такой же быстрый поиск в базе данных.

Даже если база данных была немного быстрее для поиска, вы все равно тратите время на то, чтобы БД пришлось проанализировать запрос и создать план поиска, затем собрать результаты и отправить их обратно в вашу программу. Кроме того, вы можете сохранить себе зависимость.

Если вы планируете переместить другие части вашей программы в постоянное хранилище, тогда сделайте это. Но для вашего использования должно быть достаточно хеш-карты.

0 голосов
/ 01 апреля 2009

Если предположить, что вы проверяете, есть ли слово в вашем списке, я бы сказал, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...