2012-05-14 4 views
1

У меня есть два файла csv, в которых хранятся идентификаторы и некоторые связанные поля, которые мне нужно сопоставить. В настоящее время в Python 2.4 я загружаю файлы csv в словарь объектов записи с ключом словаря в качестве идентификатора записи. Затем я перехожу через один и сопоставляю ключи в другой и выполняю некоторую обработку.Ссылка на записи CSV в очень больших файлах

Все это хорошо и работает хорошо, но это относительно небольшие файлы csv с около 60 000 записей. Мне скоро придется иметь дело со многими миллионами записей и, возможно, с несколькими файлами csv. Меня беспокоит загрузка памяти с использованием текущего метода.

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

Итак, любые идеи по хорошему способу сделать это? Я застрял в python 2.4, я не могу изменить файлы csv, и я хотел бы избежать использования sql, если это возможно. Спасибо

Редактировать: Как фигурка в шале Я ищу до 20 200 МБ файлов.

+0

Лучший подход может очень сильно зависеть от количества файлов и размера каждого файла. Можете ли вы поместить некоторые балльные номера в эти параметры? – NPE

+0

Это было бы удобно добавить, извините. Я бы сказал, максимум 200 МБ на файл и, возможно, максимум 20 файлов. Это немного на высокой стороне, но я предпочел бы быть в безопасности, чем сожалеть. Я обновляю главный пост. – Captastic

+1

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

ответ

2

Каковы причины, по которым вы хотите избежать SQL?

Вы действительно хотите переключиться на использование какой-либо базы данных. Я предлагаю SQLite для начала; он запекается в Python как sqlite3 module.. Он не имеет других зависимостей, использует простой файл (или ОЗУ) для хранения данных - нет необходимости в настройке сети/сервера - и с ним легко начать работу.

Причины, которые вы хотите, чтобы перейти к базе данных включают в себя:

  • Гораздо меньше кода писать. Вместо того, чтобы писать циклы для поиска определенных элементов, вы можете просто написать SELECT запросов.
  • База данных знает, как оптимизировать запросы так, как вы даже не думали. Это, как правило, намного, намного быстрее, чем любая псевдо-база данных, которую вы катите на Python.
  • Вы можете выполнять более сложные запросы. Вы можете выбирать строки, соответствующие определенным критериям (SELECT * FROM table WHERE...), сопоставлять записи из одной таблицы с записями из другой таблицы (SELECT * FROM table1 JOIN table2...) и т. Д.
+0

Ах, ладно, спасибо. Я не знал, что есть способ сделать sql db без проблем с сетями и серверами. Это, наверное, лучший маршрут для меня. Вы знаете модуль, который находится в python 2.4? sqllite3 является частью 2.5, и я застрял с 2.4. Боюсь. – Captastic

+0

@Captastic: см. Http://stackoverflow.com/questions/789030/how-can-i-import-the-sqlite3-module-into-python-2-4 –

+0

пятно на, спасибо – Captastic

Смежные вопросы