большое количество данных во многих текстовых файлах - как обрабатывать? - PullRequest
32 голосов
/ 30 мая 2010

У меня большие объемы данных (несколько терабайт) и они накапливаются ... Они содержатся во многих текстовых файлах с разделителями табуляции (каждый размером около 30 МБ).Большая часть задачи включает чтение данных и агрегирование (суммирование / усреднение + дополнительные преобразования) по наблюдениям / строкам на основе серии операторов предикатов, а затем сохранение вывода в виде текстовых файлов, файлов HDF5 или SQLite и т. Д. Обычно я использую Rдля таких задач, но я боюсь, что это может быть немного большим.Некоторые варианты решения:

  1. записать все это в C (или Fortran)
  2. , импортировать файлы (таблицы) непосредственно в реляционную базу данных и затем извлечь фрагменты в R или Python(некоторые преобразования не поддаются решениям на чистом SQL)
  3. написать все это на Python

Будет (3) плохой идеей?Я знаю, что вы можете обернуть C-подпрограммы в Python, но в этом случае, поскольку нет ничего вычислительно запретительного (например, оптимизационные подпрограммы, которые требуют много итерационных вычислений), я думаю, что ввод-вывод может быть таким же узким местом, как и само вычисление.Есть ли у вас какие-либо рекомендации относительно дальнейших соображений или предложений?Спасибо

Редактировать Спасибо за ваши ответы.Кажется, существуют противоречивые мнения о Hadoop, но в любом случае у меня нет доступа к кластеру (хотя я могу использовать несколько компьютеров без сети) ...

Ответы [ 8 ]

14 голосов
/ 30 мая 2010

(3) не обязательно является плохой идеей - Python облегчает обработку файла "CSV" (и, несмотря на то, что C означает запятую, табуляция как разделитель так же проста в обращении) и, конечно, получает примерно столько же пропускной способности в операциях ввода-вывода, как и на любом другом языке. Что касается других рекомендаций, numpy, кроме быстрых вычислений (которые вам могут не понадобиться согласно вашим утверждениям), предоставляет очень удобные, гибкие многомерные массивы, которые могут быть весьма полезны для ваших задач; а стандартный модуль библиотеки multiprocessing позволяет использовать несколько ядер для любой задачи, которую легко распараллелить (важно, поскольку в наши дни почти каждая машина имеет многоядерные системы; -).

13 голосов
/ 30 мая 2010

Хорошо, просто чтобы быть другим, почему бы не R?

  • Вы, кажется, знаете R, поэтому вы можете быстро приступить к работе с кодом
  • 30 МБ на файл невелико на стандартной рабочей станции с несколькими ГБ ОЗУ
  • вариант read.csv() read.table() может быть очень эффективным, если вы укажете типы столбцов с помощью аргумента colClasses: вместо того, чтобы угадывать типы для преобразования, они будут эффективно обрабатываться
  • узким местом здесь является ввод / вывод с диска, и это одинаково для всех языков
  • R имеет многоядерный для настройки параллельной обработки на машинах с несколькими ядрами (похоже на многопроцессорность Python, похоже)
  • Если вы хотите использовать «смущающе параллельную» структуру проблемы, у R есть несколько пакетов, которые хорошо подходят для задач с параллельными данными: например, snow и foreach могут быть развернуты на одной машине или на нескольких сетевых машинах.
6 голосов
/ 30 мая 2010

Посмотрите на Диско . Это легкий распределенный движок MapReduce, написанный примерно на 2000 строк Erlang, но специально разработанный для разработки на Python. Он поддерживает не только работу с вашими данными, но и надежное хранение репликации. Они только что выпустили версию 0.3, которая включает в себя слой индексации и базы данных.

4 голосов
/ 01 июня 2010

Мне повезло, используя R с Hadoop на Amazon Elastic Map Reduce. С EMR вы платите только за компьютерное время, которое вы используете, а AMZN заботится о том, чтобы раскручивать и раскручивать экземпляры. Как именно структурировать работу в EMR, действительно зависит от того, как структурирован ваш рабочий процесс анализа. Например, все ли записи, необходимые для одного задания, полностью содержатся внутри каждого CSV или вам нужны биты из каждого CSV для завершения анализа?

Вот некоторые ресурсы, которые вам могут пригодиться:

Проблема, о которой я упоминал в своем блоге, скорее связана с ограничением процессора, а не с IO. Ваши проблемы больше связаны с вводом-выводом, но советы по загрузке библиотек и файлов кэша могут быть полезны.

Хотя соблазнительно пытаться вытолкнуть это из / в реляционной базы данных, я рекомендую тщательно обдумать, действительно ли вам нужны все накладные расходы на RDB. Если вы этого не сделаете, то можете создать узкое место и проблему развития без реальной награды.

4 голосов
/ 30 мая 2010

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

Используйте Pig или Hive для запроса данных; оба имеют обширную поддержку пользовательских преобразований, поэтому вы сможете реализовать то, что вам нужно сделать, используя пользовательский код.

2 голосов
/ 31 мая 2010

Когда вы говорите «накапливать», решение (2) выглядит наиболее подходящим для задачи.
После начальной загрузки в базу данных вы обновляете базу только новыми файлами (ежедневно, еженедельно? Зависит от того, как часто вам это нужно).

В случаях (1) и (3) вам необходимо обрабатывать файлы каждый раз (что было указано ранее как наиболее затратное по времени / ресурсам), если только вы не найдете способ сохранить результаты и обновить их новыми файлами.

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

2 голосов
/ 30 мая 2010

Если у вас есть кластер машин, вы можете распараллелить ваше приложение, используя Hadoop Mapreduce. Хотя Hadoop написан на Java, он также может запускать Python. Вы можете проверить следующую ссылку для указателей на распараллеливание вашего кода - PythonWordCount

1 голос
/ 30 мая 2010

Да. Вы правы! I / O будет стоить большую часть вашего времени обработки. Я не предлагаю вам использовать распределенные системы, такие как hadoop, для этой задачи.

Ваша задача может быть выполнена на скромной рабочей станции. Я не эксперт по Python, я думаю, что он поддерживает асинхронное программирование. В F # /. Net платформа хорошо поддерживает это. Когда-то я выполнял работу по обработке изображений, загружал 20К изображений на диск и преобразовывал их в векторы функций всего за несколько минут.

В общем, загружайте и обрабатывайте ваши данные параллельно и сохраняйте результат в памяти (если она маленькая), в базе данных (если она большая)

...