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

StackOverflow https://stackoverflow.com/questions/4778089

Вопрос

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

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

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

Может случиться так, что лучший вариант - разделить его на несколько списков.

Спасибо!

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top