Работаете с файлами слишком большими для хранения в памяти?

У меня есть файл размером 20 ГБ, который выглядит следующим образом:

Read name, Start position, Direction, Sequence

Обратите внимание, что прочитанные имена не обязательно должны быть уникальными.

Например. фрагмент моего файла будет выглядеть так

Read1, 40009348, +, AGTTTTCGTA
Read2, 40009349, -, AGCCCTTCGG
Read1, 50994530, -, AGTTTTCGTA

Я хочу иметь возможность хранить эти строки таким образом, чтобы я мог

  1. сохранить файл отсортированным на основе второго значения
  2. перебрать отсортированный файл

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

Документация подразумевает, что dbm нельзя использовать для сортировки файла и повторения Это.

Поэтому мне интересно, сможет ли SQLite3 выполнять 1) и 2) . Я знаю, что смогу отсортировать свой файл с помощью SQL-запроса и перебрать набор результатов с помощью sqlite3. Однако смогу ли я сделать это без нехватки памяти на компьютере с 4 ГБ ОЗУ?


person The Unfun Cat    schedule 08.11.2012    source источник
comment
Вы можете прочитать файл построчно, загрузить его в базу данных sqlite3, а затем выполнить оператор sql с ORDERBY#   -  person Jakob Bowyer    schedule 08.11.2012
comment
И не забудьте создать индекс для Start position.   -  person    schedule 08.11.2012
comment
Вы можете разделить данные на несколько файлов на основе первых нескольких цифр начальной позиции и отсортировать каждый файл. Но правильный путь - это, вероятно, настоящая база данных.   -  person Steven Rumbalski    schedule 08.11.2012
comment
Эффективная вставка записи в середину дискового файла, т. е. без перезаписи большей части файла, — нетривиальная проблема, и в значительной степени одна из причин, по которой мы используем базы данных. Они должны иметь возможность обрабатывать 1) и 2), используя на порядок меньше памяти, чем размер набора данных. Тем не менее, повторение всего все равно будет медленным, нельзя обойти тот факт, что обработка данных общим объемом 20 ГБ занимает много времени.   -  person millimoose    schedule 08.11.2012


Ответы (2)


SQLite может выполнять как 1), так и 2).

Я рекомендую вам попробовать его и сообщить о любых проблемах, с которыми вы столкнетесь.

При размере страницы по умолчанию 1024 байта размер базы данных SQLite ограничен 2 терабайтами (241 байт). И даже если бы он мог работать с большими базами данных, SQLite хранит всю базу данных в одном файле на диске, и многие файловые системы ограничивают максимальный размер файлов чем-то меньшим. Поэтому, если вы рассматриваете базы данных такого масштаба, вам следует подумать об использовании механизма базы данных клиент/сервер, который распределяет свое содержимое по нескольким файлам на диске и, возможно, по нескольким томам.

person Community    schedule 08.11.2012
comment
Ух ты, значит, SQLite3 меня не ограничит. Спасибо. - person The Unfun Cat; 08.11.2012
comment
@TheUnfunCat Обратите внимание, что теоретически у вас может быть база данных до 140 ТБ (согласно пункту 12 об их ограничениях). страницу). Хотя технически это возможно, производительность, скорее всего, будет ужасной. Смотрите мой ответ для подсказки о производительности. - person ernie; 08.11.2012

См. этот вопрос о большие базы данных SQLlite.

Важный бит:

Я попытался вставить несколько строк в файл sqlite только с одной таблицей. Когда размер файла составлял около 7 ГБ (извините, я не могу точно указать количество строк), вставки занимали слишком много времени. Я подсчитал, что мой тест на вставку всех моих данных займет 24 часа или около того, но он не завершился даже через 48 часов.

Используемый образец составлял ~ 50 ГБ данных, хотя системные характеристики не упоминаются.

person ernie    schedule 08.11.2012
comment
Ах, так что просто вставка моего 20-гигабайтного файла займет много времени. Мне нужно будет сделать это только один раз, чтобы я мог попробовать. Мой советник рекомендовал это: docs.python.org/2.7/library/bsddb.html но по какой-то причине он устарел. - person The Unfun Cat; 08.11.2012
comment
Это может занять не так много времени. . . многое зависит от того, индексируете вы или нет. Я бы предложил попробовать и профилировать производительность. Кроме того, в зависимости от анализа биометрических данных, который вы хотите провести, вы можете разделить данные в других формах, использовать полную реляционную базу данных и т. д. Или, может быть, просто попросите вашего консультанта приобрести систему с 32 ГБ ОЗУ. . . ;) - person ernie; 08.11.2012
comment
@TheUnfunCat База данных Berkeley DB в основном представляет собой хранилище ключей и значений. Я не думаю, что он вообще предназначен для сортировки. - person millimoose; 08.11.2012
comment
Кроме того, 2009 год был некоторое время назад. Скорее всего, использование SSD (что абсолютно необходимо для любой нетривиальной работы с базой данных) значительно улучшит ситуацию. - person millimoose; 08.11.2012
comment
Имеет смысл, я описал ему чуть более простую проблему. Спасибо за информацию. А у меня SSD! С нетерпением жду возможности попробовать. Весь вклад здесь был ценным. Спасибо. - person The Unfun Cat; 08.11.2012