Python: использование большого количества объектов типа dict как память - PullRequest
1 голос
/ 07 декабря 2011

Я использую csv.DictReader для чтения некоторых больших файлов в память и последующего анализа, поэтому все объекты из нескольких CSV-файлов должны храниться в памяти. Мне нужно прочитать их как Словарь, чтобы упростить анализ, а также потому, что файлы CSV могут быть изменены путем добавления новых столбцов.

Да, можно использовать SQL, но я бы предпочел его избегать, если он не нужен.

Мне интересно, есть ли лучший и более простой способ сделать это. Меня беспокоит то, что у меня будет много объектов словаря с одинаковыми ключами и ненужной памятью? Использование __slots__ было опцией, но я узнаю атрибуты объекта только после чтения CSV.

[Редактировать:] Из-за устаревшей системы и «ограничений» использование сторонних библиотек невозможно.

Ответы [ 5 ]

2 голосов
/ 07 декабря 2011

Если вы используете Python 2.6 или более позднюю версию, collections.namedtuple - это то, что вы просите.

См. http://docs.python.org/library/collections.html#collections.namedtuple (есть даже пример использования его с csv).

РЕДАКТИРОВАТЬ: требует, чтобы имена полей были действительными в качестве идентификаторов Python, поэтому, возможно, это не подходит в вашем случае.

1 голос
/ 07 декабря 2011

Рассматривали ли вы использование панд .

Это очень хорошо работает для таблиц. Для вас важны функция read_csv и тип dataframe .

Вот как вы бы это использовали:

>>> import pandas
>>> table = pandas.read_csv('a.csv')
>>> table
   a  b  c   
0  1  2  a   
1  2  4  b   
2  5  6  word
>>> table.a
0    1
1    2
2    5
Name: a
0 голосов
/ 07 декабря 2011

Возможности:

(1) Оцените подход csv.DictReader и посмотрите, не вызывает ли это проблемы.Обратите внимание, что в диктофонах содержатся указатели на ключи и значения;фактические строки ключей не копируются в каждый файл.

(2) Для каждого файла используйте csv.Reader, после первой строки динамически создайте класс, создавайте его экземпляр один раз для оставшейся строки.Возможно, это то, что вы имели в виду.

(3) Имейте один фиксированный класс, создаваемый один раз для каждого файла, который дает вам список кортежей для фактических данных, кортеж, который отображает индексы столбца в имена столбцов, и дикт, который отображает имена столбцов в столбециндексы.Кортежи занимают меньше памяти, чем списки, поскольку не выделяется дополнительное место для добавления.Затем вы можете получить и установить свои данные с помощью (row_index, column_index) и (row_index, column_name).

В любом случае, чтобы получить лучший совет, как насчет простых фактов и статистики: какая версия Python?Сколько файлов?строк на файл?столбцы на файл?Всего уникальных ключей / имен столбцов?

0 голосов
/ 07 декабря 2011

Если все данные в одном столбце одного типа, вы можете использовать NumPy. Функции loadtxt и genfromtxt в NumPy могут использоваться для чтения файла csv. И поскольку он возвращает массив, использование памяти меньше, чем dict.

0 голосов
/ 07 декабря 2011

Используйте питона полки . Это словарь, похожий на объект, но при необходимости его можно сбросить на диск и очень легко загрузить обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...