Подтвердить что ты не робот

Большой объем данных во многих текстовых файлах - как обрабатывать?

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

  • напишите все в C (или Fortran)
  • импортировать файлы (таблицы) в реляционной базы данных напрямую и затем вытащите куски в R или Python (некоторые из преобразований не пригодны для чистых SQL-решений)
  • напишите все в Python

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

  • Вы, кажется, знаете R, чтобы быстро перейти на рабочий код.
  • 30 мб на файл невелик на стандартной рабочей станции с несколькими gb RAM
  • Вариант read.csv() read.csv() read.table() может быть очень эффективным, если вы укажете типы столбцов с помощью аргумента colClasses: вместо гостевых типов для преобразования они будут обрабатываться эффективно
  • узким местом здесь является ввод-вывод с диска, и это то же самое для каждого языка
  • R имеет multicore, чтобы настроить параллельную обработку на машинах с несколькими ядрами (похоже, многопроцессорность Python, похоже)
  • Если вы хотите использовать "неловко параллельную" структуру проблемы, R имеет несколько пакетов, которые хорошо подходят для параллельных данных: например. snow и foreach можно развернуть на только одна машина или набор сетевых машин.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

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