Обработка большой структуры данных в Java - PullRequest
7 голосов
/ 16 марта 2009

Я работаю над Java-приложением, которое требует работы с очень большими матрицами. Например, умножение двух 10 миллионов * 10 миллионов матриц! Конечно, куче Java не хватает места даже для хранения одной из этих матриц. Что я должен делать? Должен ли я использовать базы данных для хранения своих матриц и сохранения в памяти каждой необходимой части и умножения ее части за другой?

Ответы [ 9 ]

8 голосов
/ 18 марта 2009

Во-первых, матрица 10 миллионов x 10 миллионов просто огромна. Предполагая удвоения для каждой ячейки и не перегружая хранилище, каждая из этих вещей будет 800 терабайт. Простое чтение каждой ячейки из основной памяти (если она каким-то образом волшебным образом туда поместится, чего явно не происходит), заняло бы дни. Выполнение этого из любого вероятного SAN (мы поместим его в 10GbE) с большей вероятностью займет месяцы. И никакое умножение матриц не имеет сложности O (n) - нормальные подходы O (n ^ 3). Итак ... вы не делаете это с файлами, отображенными в память, общими базами данных или чем-то в этом роде.

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

Существует множество хорошо известных способов распараллеливания умножения матриц (по существу, умножения подматриц различного размера и последующего объединения результатов) и изменения структуры, чтобы шаблоны доступа имели разумную локализацию кэша путем организации данных вокруг * 1005. * кривые заполнения пространства вместо расположения строк / столбцов. Вам наверняка захочется взглянуть на классические LAPACK интерфейсы и дизайн, MKL , GotoBLAS от Intel в качестве реализаций функций BLAS, настроенных на конкретное современное оборудование и после этого вы, вероятно, отправляетесь на неизведанную территорию: -)

3 голосов
/ 16 марта 2009

Сложность умножения матриц, если она выполняется наивно, составляет O (n ^ 3), но существуют более эффективные алгоритмы. В любом случае для матрицы 10 миллионов * 10 миллионов это займет очень много времени, и вы можете столкнуться с той же проблемой кучи, но с рекурсивностью.

Если у вас сложная математика, вы можете найти инструмент, который поможет вам в этой статье .

2 голосов
/ 16 марта 2009

Используйте любой алгоритм разреженной матрицы, применимый к вашим данным. (при условии, что у вас нет 2,4 ПБ дискового пространства для хранения 3 из 10 ^ 8 квадратных неразреженных матриц двойных чисел, не говоря уже о том, что ОЗУ для базы данных в памяти - Blue Gene / Q «only» имеет 1,6 ПБ.)

2 голосов
/ 16 марта 2009

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

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

2 голосов
/ 16 марта 2009

рассмотрите использование дБ памяти, как http://hsqldb.org/

1 голос
/ 16 марта 2009

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

Проверьте эту статью для краткого введения в MMF.

1 голос
/ 16 марта 2009

Взгляните на hadoop .

1 голос
/ 16 марта 2009

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

0 голосов
/ 16 марта 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...