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

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

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

Есть ли лучшеспособы сохранить такой объект в одном файле и по-прежнему иметь произвольный (ish) доступ к нему?

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

Спасибо!

Ответы [ 3 ]

9 голосов
/ 24 января 2011

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

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

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

3 голосов
/ 24 января 2011

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

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

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

1 голос
/ 24 января 2011

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

...