что изменится, когда ваш вход будет гигабайт / терабайт?

Сегодня я впервые сделал свой первый детский шаг в реальных научных вычислениях, когда мне показали набор данных, где наименьший файл содержит 48000 полей на 1600 строк (гаплотипы для нескольких человек, для хромосомы 22). И это считается крошечным.

Я пишу Python, поэтому последние несколько часов читал о HDF5, Numpy и PyTable, но я все еще чувствую, что на самом деле не понимаю, что набор данных размера терабайта на самом деле означает для меня как программиста.

Например, кто-то отметил, что с большими наборами данных становится невозможным прочитать все это в памяти, а не потому, что у машины недостаточно ОЗУ, а потому, что у архитектуры недостаточно адресного пространства! Это взорвало мой разум.

Какие еще предположения я полагался в классе, который просто не работает с вводом этого большого? Какие вещи мне нужно, чтобы начать делать или думать по-другому? (Это не должно быть специфичным для Python.)

4 Solutions collect form web for “что изменится, когда ваш вход будет гигабайт / терабайт?”

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

  1. Базы данных не имеют большой тяги в этом домене. Почти все наши данные хранятся в файлах, некоторые из этих файлов основаны на форматах ленточных файлов, разработанных в 70-х годах. Я считаю, что часть причины неиспользования баз данных является исторической; 10, даже 5 лет назад, я думаю, что Oracle и его родственники просто не справились с задачей управления одиночными наборами данных O (TB), не говоря уже о базе данных из 1000 таких наборов данных.

    Другая причина – концептуальное несоответствие между нормализационными правилами для эффективного анализа и проектирования баз данных и характера наборов научных данных.

    Я думаю (хотя я не уверен), что причины производительности сегодня намного менее убедительны. Разумеется, теперь понятие «несоответствие концепции» также менее актуально, поскольку большинство основных доступных баз данных могут справиться с наборами пространственных данных, которые, как правило, гораздо более концептуальны, чем другие научные наборы данных. Я видел все большее использование баз данных для хранения метаданных с некоторой ссылкой, а также на файл (ы), содержащий данные датчика.

    Тем не менее, я все еще смотрю, на самом деле смотрю, HDF5. У меня есть несколько аттракционов для меня (а) это просто еще один формат файла, поэтому мне не нужно устанавливать СУБД и бороться с ее сложностями, и (б) с правильным оборудованием я могу читать / записывать файл HDF5 параллельно , (Да, я знаю, что я могу читать и писать базы данных параллельно).

  2. Это приводит ко второму вопросу: при работе с очень большими наборами данных вам действительно нужно думать о параллельном вычислении. Я работаю в основном в Fortran, одна из его сильных сторон – синтаксис массива, который очень хорошо подходит для многих научных вычислений; другая – хорошая поддержка для возможности параллелизации. Я считаю, что Python имеет все виды поддержки параллелизации, поэтому, вероятно, это не плохой выбор для вас.

    Конечно, вы можете добавить параллелизм в последовательные системы, но гораздо лучше начать проектирование для параллелизма. Возьмем только один пример: лучший последовательный алгоритм для проблемы очень часто не лучший кандидат для параллелизации. Возможно, вам лучше использовать другой алгоритм, который лучше масштабируется на нескольких процессорах. Что ведет аккуратно к следующему пункту.

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

  4. Производительность начинает серьезно зависеть как производительность исполнения программ, так и производительность разработчика. Дело не в том, что для набора данных 1 ТБ требуется в 10 раз больше кода, чем набор данных 1 ГБ, поэтому вам нужно работать быстрее, но некоторые идеи, которые вам нужно реализовать, будут безумно сложными и, вероятно, должны быть написаны специалистами домена, т.е. с учеными, с которыми вы работаете. Здесь специалисты домена пишут в Matlab.

Но это происходит слишком долго, мне лучше вернуться к работе

Вкратце, основные отличия ИМО:

  1. Вы должны заранее знать, каким будет ваше узкое место (I / O или CPU), и сосредоточьтесь на лучшем алгоритме и инфраструктуре для решения этой проблемы. Ввод-вывод довольно часто является узким местом.
  2. Выбор и тонкая настройка алгоритма часто доминируют над любым другим сделанным выбором.
  3. Даже незначительные изменения в алгоритмах и шаблонах доступа могут влиять на производительность на порядки. Вы будете много оптимизировать. «Лучшее» решение будет зависящим от системы.
  4. Поговорите со своими коллегами и другими учеными, чтобы извлечь выгоду из их опыта с этими наборами данных. В учебниках много трюков невозможно найти.
  5. Предварительные вычисления и хранение могут быть чрезвычайно успешными.

Полоса пропускания и ввод-вывод

Первоначально пропускная способность и ввод-вывод часто являются узким местом. Чтобы дать вам перспективу: при теоретическом ограничении для SATA 3 , требуется около 30 минут для чтения 1 ТБ. Если вам нужен произвольный доступ, прочитайте несколько раз или напишите, вы хотите делать это в памяти большую часть времени или нуждаетесь в чем-то значительно быстрее (например, iSCSI с InfiniBand ). В идеале ваша система должна быть в состоянии сделать параллельный ввод-вывод максимально приближенным к теоретическому пределу того интерфейса, который вы используете. Например, простой доступ к различным файлам параллельно в разных процессах или HDF5 поверх ввода / вывода MPI-2 довольно распространен. В идеале вы также выполняете вычисления и ввод-вывод параллельно, чтобы один из двух был «бесплатным».

Кластеры

В зависимости от вашего случая, I / O или CPU могут быть узким местом. Независимо от того, какой из них он достигнет, с помощью кластеров можно добиться огромного увеличения производительности, если вы сможете эффективно распределять свои задачи (например, MapReduce ). Это может потребовать совершенно разных алгоритмов, чем типичные примеры учебников. Проведение времени разработки здесь часто является лучшим временем.

Алгоритмы

При выборе между алгоритмами очень важна большая O алгоритма, но алгоритмы с подобным большим O могут резко отличаться по производительности в зависимости от локальности. Менее локальный алгоритм (т. Е. Больше промахов в кеше и промахов в основной памяти), тем хуже будет производительность – доступ к хранилищу обычно на порядок медленнее, чем основная память. Классическими примерами для улучшения были бы чередование для умножения матриц или обмена петлями .

Компьютер, язык, специализированные инструменты

Если ваше узкое место – это ввод-вывод, это означает, что алгоритмы для больших наборов данных могут извлечь выгоду из большей памяти (например, 64-разрядной) или языков программирования / структур данных с меньшим потреблением памяти (например, в Python __slots__ может быть полезно), поскольку больше память может означать меньше ввода-вывода на процессорное время. BTW, системы с ТБ основной памяти не являются неслыханными (например, HP Superdomes ).

Аналогичным образом, если вашим узким местом является процессор, более быстрые машины, языки и компиляторы, которые позволят вам использовать специальные функции архитектуры (например, SIMD, например SSE ), могут повысить производительность на порядок.

То, как вы находите и получаете доступ к данным, и хранить метаинформацию, может быть очень важным для производительности. Вы часто используете плоские файлы или нестандартные пакеты для хранения данных (например, не реляционные db напрямую), которые позволяют вам более эффективно получать доступ к данным. Например, kdb + является специализированной базой данных для больших временных рядов, а ROOT использует объект TTree для эффективного доступа к данным. Вы можете упомянуть упомянутые выше pyTables .

Хотя некоторые языки, естественно, имеют меньшие накладные расходы памяти в своих типах, чем другие, что действительно не имеет значения для данных такого размера – вы не держите весь свой набор данных в памяти, независимо от языка, который вы используете, поэтому «расход», Python здесь не имеет значения. Как вы указали, просто недостаточно адресного пространства, чтобы даже ссылаться на все эти данные, не говоря уже о том, чтобы удерживать его.

Обычно это означает: a) сохранение ваших данных в базе данных или b) добавление ресурсов в виде дополнительных компьютеров, что добавляет ваше доступное адресное пространство и память. Реально вы в конечном итоге будете делать обе эти вещи. Одна из ключевых вещей, которые следует учитывать при использовании базы данных, заключается в том, что база данных – это не просто место для размещения ваших данных, пока вы ее не используете, вы можете делать WORK в базе данных, и вы должны попытаться это сделать. Используемая вами технология баз данных оказывает большое влияние на работу, которую вы можете выполнять, но база данных SQL, например, хорошо подходит для выполнения множества заданных математических задач и делает это эффективно (конечно, это означает, что дизайн схемы становится очень важная часть вашей общей архитектуры). Не просто высасывайте данные и манипулируйте ими только в памяти – попробуйте использовать возможности вычислительных запросов вашей базы данных, чтобы сделать как можно больше работы, прежде чем вы будете помещать данные в память в свой процесс.

Основными предположениями являются объем памяти cpu / cache / ram / storage / bandwidth, который вы можете иметь на одной машине по приемлемой цене. В stackoverflow есть много ответов, которые по-прежнему основаны на старых предположениях 32-битной машины с 4 Гб оперативной памяти и около терабайта памяти и сети 1 Гбит. С 16-Гбайт модулями памяти DDR-3 на 220 евро, 512 ГБ оперативной памяти, 48 основных машин могут быть построены по разумным ценам. Другим важным изменением является переход с жестких дисков на SSD.

Python - лучший язык программирования в мире.