Должен ли я сохранить файл в виде текста или импортировать в базу данных?

1

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

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

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

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

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

Спасибо.

  • 0
    Немного больше информации было бы полезно: почему вы чувствуете необходимость перейти на базу данных? Вы беспокоитесь о многопользовательском и загрузке всех слов в память? Как ваша текущая реализация использует файл? Вы храните слова в хеш-таблице для быстрого доступа? ...
Теги:

3 ответа

2
Лучший ответ

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

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
0

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

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

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

  • 0
    ? База данных будет по крайней мере в сто раз медленнее, чем хэш в памяти. Но нет необходимости хешировать, просто отсортируйте список, начните с 26 первых букв в виде радиуса, а затем выполните бинарный поиск

Ещё вопросы

Сообщество Overcoder
Наверх
Меню