Влияет Ли Объем Данных На Сложность Разработки? Бухгалтерия В Муравейнике

Недавно мы с коллегой обсуждали, влияет ли объем данных на сложность разработки.

Сухой остаток остается:

  • Объем данных не должен оказывать существенного влияния на сложность разработки.

    Основная сложность разработки, как правило, связана со сложностью алгоритма обработки данных, а не с их количеством.

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

  • Все основные вычислительные алгоритмы известны давно (по крайней мере, несколько десятилетий).

    Главное – как можно раньше (до начала разработки) определить правильный подход к проблеме.

    Но это вопрос не трудоемкости, а профессиональной пригодности - то есть аппаратное обеспечение должно быть заранее изучено и быстро разработано.

  • Ни один Заказчик не поймет, почему сложность разработки кода в несколько сотен строк отняла много времени.

    Заказчику проще сменить команду, чем вкладывать свое время и деньги в чей-то процесс обучения или в какой-то непонятный ему эксперимент.

  • Конечно, могут быть некоторые небольшие накладные расходы, связанные с объемом данных.

    Но эти затраты обычно не превышают погрешности первоначальной (правильной) оценки трудоемкости и учитывать их отдельно не имеет смысла.

Для разработчика, прямо скажем, выводы оказались не очень веселыми и однозначными.

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

Цель публикации — поделиться опытом обработки двух связанных списков по миллиарду записей в каждом за приемлемое время.



Постановка задачи

Данные, представленные в публикации, аналогичны данным исходной задачи.

Изменения коснулись преимущественно прикладной терминологии.

Назовем это «Бухгалтерия в муравейнике».

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

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

Была создана система, животным были присвоены номера, а также норкам, берлогам и гнездам.

Короче говоря, все оказалось просто и быстро.

Об этом они узнали в муравейнике и тоже решили разработать свою систему учета.

За основу взята система регистрации животных.

В результате каждый муравей получил номер имени и номер дома.

Каждому муравью был присвоен тип: рабочий, солдат,.

Дома были распределены по площадям муравейника: центр, верх, низ,.

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

муравейника во все части муравейника.

Сделать это необходимо, как обычно принято в таких случаях, срочно и без промедления.

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

И муравьев было миллиард.

Влияет ли объем данных на сложность разработки? Бухгалтерия в муравейнике

Структура данных представлена на рисунке:

  • ant_type - виды муравьев (1 - королева, 2 - личинка, 3 - няня, 4 - рабочий, 5 - солдат)
  • Hill_type - районы муравейника (1 - центр, 2 - верх, 3 - низ, 4 - север, 5 - юг, 6 - восток, 7 - запад)
  • ant_list — список муравьев (миллиарды записей)
  • cell_list — список домов (млрд записей)
  • ant_to_cell — какой муравей в каком доме живет (миллиард записей)
Задача — подготовить для каждого участка муравейника (hill_type) свой список живущих в нем муравьев (ant_list), определенного вида (ant_type) и с номерами их домов (cell_list).



Данные испытаний

Для интересующихся есть утилита для генерации тестовых данных.

Утилита подготовлена в виде консольной программы, написанной на C# (Visual Studio Community 2013).

Код утилиты выложен на GitHub в файле муравейник-makedata.cs .

Чтобы получить работающую программу в Visual Studio, необходимо создать консольный проект, заменить файл program.cs на anthill-makedata.cs и собрать проект. Такой подход был выбран с точки зрения компактности, наглядности и безопасности распространения.

По умолчанию (без параметров) утилита готовит набор тестовых данных (5 файлов в формате CSV) на тысячу записей.

В качестве параметра можно указать желаемый размер данных — от тысячи до миллиарда: anthill-makedata.exe 1000000000 Подготовка тестовых данных из миллиарда записей займет до 30 минут и около 50 Гигабайт дискового пространства.

Время выполнения можно посмотреть в журнале (anthill-makedata.log).

Вы можете использовать FAR для просмотра данных.



Решение

Здесь для интересующихся можно подумать, как бы они решили эту проблему.

В процессе разработки выяснилось, что моё железо «не очень хорошее», поскольку ни при первом, ни при втором прогоне не удалось добиться приемлемой производительности.

Обработка полных данных была очень и очень медленной.

Причиной тому стала процедура поиска, которая выполнялась быстро на небольших данных, но по мере увеличения данных все неприлично замедлялось.

В конце концов решение было найдено.

Более того, даже того, что было под капотом моего не очень мощного компьютера, хватило для работы с полными данными: CPU — Core 5i, RAM — 12Gb (было 8, добавилось 4), HDD — самый простой (5400 об/мин).

Суть решения — использовать обычный индексный массив.

Для каждого списка создается массив размером в миллиарды.

Номер ячейки массива соответствует номеру объекта (муравей, дом).

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

После заполнения массивов муравьев и домиков (из тестовых данных — файлов anthill-ant-list.csv и anthill-cell-list.csv) «растягивается» файл подключения anthill-ant-to-cell.csv. и файлы (CSV) с результатами.

Доступ к ячейке массива по индексу происходит мгновенно, так как не тратится время на поиск.

При этом основная часть времени тратится на чтение и запись файлов (работа с HDD).

Решение подготовлено в виде консольной программы, написанной на C# (Visual Studio Community 2013).

Код программы выложен на GitHub в файле anthill-makeresult.cs .

Чтобы получить работающую программу в Visual Studio, необходимо создать консольный проект, заменить файл program.cs на anthill-makeresult.cs и собрать проект (обратите внимание: в свойствах проекта в разделе BUILD снимите флажок [Предпочитать 32 -кусочек]).

Программу следует запускать в той же директории, где находятся файлы тестовых данных.

По умолчанию (без параметров) программа готовит списки муравьев-солдат (CSV-файлы).

Вы можете указать желаемый тип в качестве параметра: anthill-makeresult.exe 4 (4 — код «рабочего» типа) Подготовка результатов на основе полных данных занимает до 30 минут. С учетом тестовых данных потребуется около 100 Гигабайт дискового пространства.



Краткое содержание

Для рассматриваемой задачи оказалось верным утверждение о том, что объем данных не оказывает существенного влияния на сложность разработки:
  • Готовое решение оказалось простым и уместилось в 300 строк кода, включая обработку ошибок, логирование и комментарии.

  • Решение одинаково работает как с небольшими, так и с большими (до заданного размера) данными.

  • Основной тормоз не в обработке данных, а в операциях ввода/вывода (медленная работа HDD).

К недостаткам относятся:
  • Подход не является универсальным.

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

  • Работа с CSV-файлами не всегда удобна, не защищена от ошибок и не гарантирует целостности данных.

Теги: #Алгоритмы #индексы #большие данные #производительность #Высокая производительность #Алгоритмы #Большие данные
Вместе с данным постом часто просматривают: