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

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

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

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

Отредактируйте спасибо за свои ответы. Там, кажется, конфликтует мнения о Hadoop, но в любом случае у меня нет доступа к кластеру (хотя я могу использовать несколько несетевых машин)...

32
задан hatmatrix 30 May 2010 в 07:01
поделиться

8 ответов

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

14
ответ дан 27 November 2019 в 20:59
поделиться

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

6
ответ дан 27 November 2019 в 20:59
поделиться

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

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

4
ответ дан 27 November 2019 в 20:59
поделиться

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

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

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

1
ответ дан 27 November 2019 в 20:59
поделиться

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

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

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

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

4
ответ дан 27 November 2019 в 20:59
поделиться

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

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

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

2
ответ дан 27 November 2019 в 20:59
поделиться

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

2
ответ дан 27 November 2019 в 20:59
поделиться

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

  • Вы, кажется, знаете R, так что вы можете быстро приступить к работе с кодом
  • 30 МБ на файл - это небольшой размер на стандартной рабочей станции с несколькими ГБ оперативной памяти
  • read.csv () вариант read.table () может быть очень эффективным, если вы укажете типы столбцов с помощью аргумента colClasses : вместо определения типов для преобразования, они будут обрабатываться эффективно
  • узким местом здесь является ввод-вывод с диска, и это то же самое для всех языков
  • R имеет многоядерность для настройки параллельной обработки на машинах с несколькими ядрами (аналогично Кажется, многопроцессорность Python)
  • Если вы захотите использовать «досадно параллельную» структуру задачи, у R есть несколько пакетов, которые хорошо подходят для задач с параллельными данными: E .грамм. Каждый из snow и foreach может быть развернут только на одной машине или на наборе сетевых машин.
13
ответ дан 27 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: