Как манипулировать * огромными * объемами данных - PullRequest
11 голосов
/ 13 апреля 2010

У меня следующая проблема. Мне нужно хранить огромное количество информации (~ 32 ГБ) и иметь возможность манипулировать ею как можно быстрее. Мне интересно, как лучше всего это сделать (комбинации языка программирования + ОС + все, что вы считаете важным).

Структура информации, которую я использую, представляет собой массив 4D (NxNxNxN) с плавающей запятой двойной точности (8 байт). Сейчас мое решение состоит в том, чтобы разделить массив 4D на двумерные массивы и сохранить их в отдельных файлах на жестком диске моего компьютера. Это действительно медленно и манипулирование данными невыносимо, так что это совсем не решение!

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

Альтернативное решение, о котором я думаю, - это купить выделенный сервер с большим количеством оперативной памяти, но я не знаю точно, решит ли это проблему. Поэтому сейчас мое невежество не позволяет мне выбрать лучший путь.

Что бы вы сделали, если бы оказались в такой ситуации? Я открыт для любой идеи.

Заранее спасибо!


РЕДАКТИРОВАТЬ: Извините, что не предоставил достаточно информации, я постараюсь быть более конкретным.

Я храню дискретизированную математическую функцию 4D. Операции, которые я хотел бы выполнить, включают транспонирование массива (изменение b [i, j, k, l] = a [j, i, k, l] и т.п.), умножение массива и т. Д.

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


РЕДАКТИРОВАТЬ (2):

Я также хотел бы иметь возможность хранить больше информации в будущем, поэтому решение должно быть как-то масштабируемым. В настоящее время цель 32 ГБ состоит в том, что я хочу иметь массив с N = 256 точками, но было бы лучше, если бы я мог использовать N = 512 (что означает 512 ГБ для его хранения !!).

Ответы [ 14 ]

0 голосов
/ 13 апреля 2010

Можно ли решить эту проблему с помощью этой процедуры?

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

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

Будет ли это быстрее, чем подход с жестким диском? Или я ломаю орехи кувалдой?

0 голосов
/ 13 апреля 2010

Для транспозиций быстрее просто изменить свое понимание того, что такое индекс. Под этим я подразумеваю, что вы оставляете данные там, где они есть, и вместо этого оборачиваете делегат доступа, который превращает b[i][j][k][l] в запрос на выборку (или обновление) a[j][i][k][l].

0 голосов
/ 13 апреля 2010

Первое, что я бы порекомендовал, это выбрать объектно-ориентированный язык и разработать или найти класс, который позволит вам манипулировать 4-D массивом, не заботясь о том, как он на самом деле реализован.

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

Наконец, как только я отладил свои алгоритмы и данные, я стал искать время для покупки машины, которая могла бы хранить все данные в памяти. Amazon EC2 , например, предоставит вам компьютер с 68 ГБ памяти за 2,40 доллара США в час (меньше, если вы играете с точечными экземплярами).

0 голосов
/ 13 апреля 2010

Вся технология баз данных связана с манипулированием огромными объемами данных, которые не помещаются в ОЗУ, так что это может стать вашей отправной точкой (например, получить хорошую книгу принципов DBMS и прочитать об индексировании, выполнении запросов и т. Д.).
Многое зависит от того, как вам нужен доступ к данным - если вам абсолютно необходимо прыгать и получать доступ к случайным битам информации, у вас проблемы, но, возможно, вы можете структурировать свою обработку данных так, чтобы вы сканировали ее по одной ось (размерность). Затем вы можете использовать меньший буфер и постоянно выгружать уже обработанные данные и читать новые данные.

...