Способы хранения и доступа к большим (~ 10 ГБ) спискам в Python?

У меня есть большой набор строк, которые я использую для изучения естественного языка, и я бы хотел иметь хороший способ сохранить его в Python.

Я мог бы использовать pickle, но загрузка всего списка в память тогда была бы невозможной (я считаю), поскольку она имеет размер около 10 ГБ, и у меня не так много основной памяти. В настоящее время у меня есть список, хранящийся в библиотеке полки... Полка индексируется строками "0", "1",..., "n", которая немного неуклюжа.

Существуют ли более удобные способы хранения такого объекта в одном файле и все еще имеют случайный (ish) доступ к нему?

Возможно, лучший вариант - разбить его на несколько списков.

Спасибо!

Ответ 1

В зависимости от того, как вы собираетесь получать данные, SQLite3 может быть лучшим подходом. SQLite3 отлично подходит для случайного доступа к реляционным данным, но если ваши данные не очень реляционные, это может не иметь особого смысла. (Даже если у вас все есть номер "id", а затем ваша строка, я думаю, что SQLite3 для базового хранилища ваших строк может быть отличным.)

Если вы можете определить какой-то механизм, чтобы сгруппировать ваши строки каким-то образом, которые вы использовали бы их (скажем, если некоторые из ваших предложений подразумевали объекты или предметы, и вы хотели бы провести исследование на них конкретно; или в зависимости от источника ваших строк, будь то формальный или неформальный или гиперинформальный) или что-то в этом роде, тогда вы можете значительно сократить "рабочий набор" ваших данных, разделив его и потенциально резко повысить пропускную способность своих исследований. Но если вы намереваетесь на действительно случайный доступ, тогда одна большая куча может быть лучше.

Надеюсь, что это поможет.

Ответ 2

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

С помощью некоторого Object Relational Mapper (например, sqlalchemy) вы можете иметь объектно-ориентированное представление данных и перебрать строки или работать с большими подмножествами ваших данных последовательно (если это применимо для вашей задачи).

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

Ответ 3

Я бы сказал, что используется полка (которая использует бэкэнд bdb) или Sqlite3.
Я бы пошел с SQLite3, для простого списка достаточно таблицы типа CREATE TABLE list(idx int primary key, value text);.