Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Обработка больших объемов данных C#

#c_sharp


Столкнулся с проблемой обработки и хранения больших объемов данных. Пишу исследовательское
приложение, в задачи которого входит систематизация и обработка статистических данных.
Исходный файл, содержащий собственно данные, представляет из себя бинарник, достигающий
1Гб в размере. После расфасовки данных в классы объем памяти, требуемый для хранения
всех загруженных данных, может увеличиться до нескольких гигабайт. Но это так... для
затравки =) В действительности же все еще хуже. Теоретически объем данных, который
необходимо обрабатывать, может достигать таких размеров, что эти данные в принципе
невозможно хранить в ОП. 

Примером операции обработки может служить операция построения спектра на основе исходных
данных, причем построение спектра не должно занимать более 2-3 сек. Т.е. необходимо
извлечь данные из хранилища, сделать из них выборку и построить из выбранных данных спектр.

Пытался решить задачу двумя способами:


Хранить данные на ЖД и делать выборку в ОП только необходимых в данный момент данных
(прошу прощения за неблагозвучность).
Вносить все данные в базу данных и делать выборки оттуда.


Первый способ в качестве плюсов имеет быструю скорость внесения записей в импровизированную
"базу", но скорость выборок оставляет желать лучшего. Да и постоянная перекачка данных
из ОП на ЖД и обратно, при объемах перекачиваемых данных сопоставимых с объемом ОП,
провоцирует сбои в работе программы, вплоть до ее зависания.

Со вторым способом все наоборот. Прекрасно работают выборки, но время внесения данных
в базу может достигать 3-ех минут (единовременно в базу необходимо вносить порядка
25к записей). Такое время совершенно неприемлемо.

Теперь о средствах проектирования. Приложение разрабатывается на C# в Visual Studio.
Базу использовал MS-скую. Пробовал работать с базой через ORM и без него, нужных результатов
не добился. Приложение работает в пределах одного ПК, данные поступают извне по Ethernet.

Какие средства можно использовать для быстрой обработки объемных данных?
    


Ответы

Ответ 1



1 ГБ данных можно перенести в SQL Server Compact - бесплатная встраиваемая БД. Вся база поместится в одном sdf-файле (максимальный размер - 4 ГБ). Для загрузки данных можно использовать SqlCeBulkCopy. Примерная скорость загрузки: 1 000 000 rows: 6 seconds = 166 666 rows/second 5 000 000 rows: 28 seconds = 178 000 rows/second Также для загрузки данных в sdf можно использовать ExecuteResultSet. Пример на C# - тут. Для быстрой выборки необходимых данных, а также для сохранения изменений, можно использовать SqlCeDataAdapter. Для вывода графиков можно использовать Chart. Ниже скриншот вывода более 100 тыс. координат. Создание и вывод происходит достаточно быстро. Пример на C# - тут.

Ответ 2



Посмотрите в сторону систем аналитики - Microsoft SQL Server Analysis Services, Mondrian, Jedox. Уж больно сильно выполняемые ими задачи схожи с вашей. Насчет C# - можете использовать LINQ или MDX работы с ними, прямо в своём приложений. Для быстрой же вставки больших объемов данных в SQL Server обычно используют BULK INSERT. В частности, в .NET есть удобная стандартная обёртка для него - SqlBulkCopy. С его помощью спокойно можно загружать в SQL Server гиганские объемы(хоть сотни терабайт) данных, со скоростью фактически не отличающейся от скорости чтения/записи с диска(построение индексов и проверки ограничений проходят пост-фактум, уже после загрузки всех данных, тоже пакетно в фоне)

Ответ 3



Я для хранения данных использовал Кассандру Плюсы - быстрая вставка, минус - не совсем быстрая выборка, для каждого критерия выборки нужен свой индекс, без чего хорошо обходится MSSQL, ест много места. Обработка данных можно осуществить в потоковом режиме, паралельно, частями для этого я использовал Шторм. Плюсы - параллелизм обработки, гибкость, наличие статистических библиотек, Минусы - Java (если ты программист не только С# то это не минус) Я знаю Java не очень хорошо, но свою задачу решил. Как вариант можно делать обработку данных на Python или Cloujure Kaк буфер, можно использовать сервер очередей Сервером очередей может быть любой сервер, а можно и без него, я просто не знаю, как происходит прием потоковых данных. Есть еще стек Hadoop Streaming, но он более тяжелый. Для статистического анализа, не потокового (исследовательского), можно использовать R, а потом, когда определился с обработкой - переписать на python или java. Удачи в изучении новых технологий.

Комментариев нет:

Отправить комментарий