У меня есть большие объемы данных (несколько терабайт) и накопление... Они содержатся во многих разграниченных вкладкой плоских текстовых файлах (каждый приблизительно 30 МБ). Большая часть задачи включает чтение данных и агрегацию (суммирующий/составляющий в среднем + дополнительные преобразования) по наблюдениям/строкам на основе серии операторов предиката и затем сохраняющий вывод как текст, HDF5 или файлы SQLite, и т.д. Я обычно использую R для таких задач, но я боюсь, что это может быть немного большим. Некоторые варианты решения к
(3) была бы плохая идея? Я знаю, что можно перенести стандартные программы C в Python, но в этом случае так как нет ничего в вычислительном отношении препятствующего (например, стандартные программы оптимизации, которые требуют многих повторяющихся вычислений), я думаю, что ввод-вывод может быть таким же количеством узкого места как само вычисление. У Вас есть какие-либо рекомендации на дальнейших соображениях или предложениях?Спасибо
Отредактируйте спасибо за свои ответы. Там, кажется, конфликтует мнения о Hadoop, но в любом случае у меня нет доступа к кластеру (хотя я могу использовать несколько несетевых машин)...
(3) не обязательно плохая идея - Python позволяет легко обрабатывать файлы "CSV" (и несмотря на то, что C означает Comma, tab в качестве разделителя так же легко обрабатывается) и, конечно, получает примерно такую же пропускную способность в операциях ввода-вывода, как и любой другой язык. Что касается других рекомендаций, numpy
, помимо быстрых вычислений (которые вам, возможно, не нужны в соответствии с вашими заявлениями), предоставляет очень удобные, гибкие многомерные массивы, которые могут быть весьма удобны для ваших задач; а модуль стандартной библиотеки multiprocessing
позволяет вам использовать несколько ядер для любых задач, которые легко распараллелить (важно, поскольку почти каждая машина в наши дни имеет много ядер;-)).
Взгляните на Disco. Это легкий распределенный MapReduce движок, написанный примерно на 2000 строк на Erlang, но специально разработанный для разработки на Python. Он поддерживает не только работу с данными, но и надежное хранение и репликацию. Они только что выпустили версию 0.3, которая включает слой индексирования и базы данных.
С терабайтами вы в любом случае захотите распараллелить чтение на многих дисках; так что лучше сразу перейти к Hadoop.
Для запроса данных используйте Pig или Hive; оба имеют широкую поддержку пользовательских преобразований, поэтому вы сможете реализовать то, что вам нужно, с помощью пользовательского кода.
Да. Вы правы! Ввод-вывод будет стоить вам большей части времени обработки. Я не советую вам использовать распределенные системы, такие как hadoop, для этой задачи.
Ваша задача может быть решена на скромной рабочей станции. Я не специалист по Python, но думаю, что в нем есть поддержка асинхронного программирования. В платформе F#/.Net есть хорошая поддержка для этого. Однажды я занимался обработкой изображений, загрузка 20K изображений на диск и преобразование их в векторы признаков занимает всего несколько минут в параллельном режиме.
В общем, загружайте и обрабатывайте данные параллельно и сохраняйте результат в памяти (если он маленький), в базе данных (если большой).
Мне повезло, я использовал R с Hadoop на Amazon Elastic Map Reduce. Используя EMR, вы платите только за используемое компьютерное время, а AMZN позаботится о раскрутке и замедлении инстансов. То, как именно структурировать работу в EMR, действительно зависит от того, как структурирован ваш рабочий процесс анализа. Например, все ли записи, необходимые для одного задания, полностью содержатся внутри каждого CSV или вам нужны биты из каждого CSV для завершения анализа?
Вот некоторые ресурсы, которые могут оказаться полезными:
Проблема, о которой я упоминал в своем сообщении в блоге, связана скорее с привязкой к процессору, а не с привязкой к вводу-выводу. Ваши проблемы связаны с вводом-выводом, но советы по загрузке библиотек и файлов кеша могут быть полезны.
Хотя заманчиво попытаться засунуть это в / из реляционной базы данных, я рекомендую внимательно подумать, действительно ли вам нужны все накладные расходы, связанные с RDB. Если вы этого не сделаете, вы можете создать узкое место и создать проблему для развития без реальной награды.
Когда вы говорите "накапливается", то решение (2) выглядит наиболее подходящим для решения проблемы.
После первоначальной загрузки в базу данных вы только обновляете базу данных новыми файлами (ежедневно, еженедельно? зависит от того, как часто вам это нужно).
В случаях (1) и (3) вам нужно обрабатывать файлы каждый раз (что, как было сказано ранее, требует больше всего времени/ресурсов), если только вы не найдете способ хранить результаты и обновлять их новыми файлами.
Вы можете использовать R для обработки файлов из csv в, например, базу данных SQLite.
Если у вас есть кластер машин, вы можете распараллелить свое приложение с помощью Hadoop Mapreduce. Хотя Hadoop написан на Java, он также может запускать Python. По следующей ссылке вы найдете указатели для распараллеливания вашего кода - PythonWordCount
Хорошо, так что просто Чтобы отличаться, почему бы не R?
read.csv ()
вариант read.table ()
может быть очень эффективным, если вы укажете типы столбцов с помощью аргумента colClasses
: вместо определения типов для преобразования, они будут обрабатываться эффективно