В двух словах, основные отличия ИМО:
- Вы должны заранее знать, что будет вашим вероятным узким местом (ввод-вывод или ЦП), и сосредоточиться на лучшем алгоритме и инфраструктуре для решения этой проблемы. Ввод/вывод довольно часто является узким местом.
- Выбор и тонкая настройка алгоритма часто доминируют над любым другим сделанным выбором.
- Даже скромные изменения в алгоритмах и шаблонах доступа могут повлиять на производительность на несколько порядков. Вы будете много микрооптимизировать. «Лучшее» решение будет системно-зависимым.
- Поговорите со своими коллегами и другими учеными, чтобы извлечь пользу из их опыта работы с этими наборами данных. Многих трюков в учебниках не найти.
- Предварительные вычисления и хранение могут быть чрезвычайно успешными.
Пропускная способность и ввод-вывод
Первоначально пропускная способность и ввод-вывод часто являются узким местом. Чтобы дать вам представление: при теоретическом пределе для SATA 3 чтение 1 ТБ занимает около 30 минут. Если вам нужен произвольный доступ, чтение несколько раз или запись, вы хотите делать это в памяти большую часть времени или вам нужно что-то существенно более быстрое (например, iSCSI с InfiniBand). В идеале ваша система должна иметь возможность выполнять параллельный ввод-вывод, чтобы максимально приблизиться до теоретического предела любого интерфейса, который вы используете. Например, простой параллельный доступ к разным файлам в разных процессах или HDF5 поверх ввод-вывод MPI-2 довольно распространен. В идеале вы также выполняете вычисления и ввод-вывод параллельно, чтобы один из двух был «бесплатным».
Кластеры
В зависимости от вашего случая узким местом может быть либо ввод-вывод, либо ЦП. Независимо от того, какой из них, с помощью кластеров можно добиться значительного повышения производительности, если вы сможете эффективно распределять свои задачи (пример MapReduce). Для этого могут потребоваться совершенно другие алгоритмы, чем типичные примеры из учебников. Тратить время на разработку здесь часто бывает лучше всего.
Алгоритмы
При выборе между алгоритмами большой O алгоритма очень важен, но алгоритмы с таким же большим O могут сильно различаться по производительности в зависимости от местоположения. Чем менее локален алгоритм (т.е. чем больше промахов кэша и основной памяти), тем хуже будет производительность — доступ к хранилищу обычно на порядок медленнее, чем к основной памяти. Классическими примерами улучшений могут быть плитка для умножения матриц или обмен циклами.
Компьютер, язык, специальные инструменты
Если вашим узким местом является ввод-вывод, это означает, что алгоритмы для больших наборов данных могут выиграть от большего объема оперативной памяти (например, 64-разрядной) или языков программирования/структур данных с меньшим потреблением памяти (например, в Python __slots__
может оказаться полезным), так как больший объем памяти может означать меньшее количество операций ввода-вывода за процессорное время. Кстати, системы с ТБ оперативной памяти не являются чем-то необычным (например, HP Superdomes).
Точно так же, если вашим узким местом является ЦП, более быстрые машины, языки и компиляторы, позволяющие использовать специальные функции архитектуры (например, SIMD, например SSE), может повысить производительность на порядок.
То, как вы находите и получаете доступ к данным, а также храните метаинформацию, может быть очень важным для производительности. Вы часто будете использовать плоские файлы или нестандартные пакеты для предметной области для хранения данных (например, не реляционную базу данных напрямую), которые позволяют более эффективно получать доступ к данным. Например, kdb+ — это специализированная база данных для больших временных рядов, а ROOT использует TTree
для эффективного доступа к данным. Упомянутые вами pyTables могут быть еще одним примером.
person
stephan
schedule
10.06.2010