Время обработки Java Matrix - PullRequest
       24

Время обработки Java Matrix

0 голосов
/ 28 августа 2010

Мне нужно простое мнение от всех Гуру!

Я разработал программу для некоторых матричных вычислений. Все отлично работает с маленькая матрица. Однако, когда я начинаю вычислять BIG тысячи столбцов матрицы матрицы. Это убивает скорость.

Я думал сделать обработку для каждой строки и записать результат в файл, а затем освободить память и начать обработку 2-й строки и записать в файл, и так далее.

Поможет ли это улучшить скорость? Я должен сделать большие изменения, чтобы осуществить это изменение. Это почему мне нужно ваше мнение. Что ты думаешь?

Спасибо

П.С .: Я знаю о кольте и матрице Джама. Я не могу использовать эти пакеты из-за компании правила.


Отредактировано

В моей программе я храню всю матрицу в двухмерном массиве, и если матрица мала, это нормально. Тем не менее, когда он имеет тысячи столбцов и строк. Тогда сохранение всей этой матрицы в памяти для расчета вызывает проблемы с производительностью. Матрица содержит плавающие значения. Для обработки я читаю всю память матрицы в памяти, затем начинаю расчет. После расчета я записываю результат в файл.

Ответы [ 4 ]

3 голосов
/ 28 августа 2010

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

Возможно, вам следует сначала подумать об оптимизации алгоритма.

И, как я всегда говорю, для всех вопросов производительности - спрашивать людей - это одно, но ничто не заменит это! Мнения не имеют значения, измеримы ли реальные показатели.

2 голосов
/ 28 августа 2010

Вы должны помнить, что выполнение NxN, умноженное на NxN, требует 2xN ^ 3 вычислений. Несмотря на это, это не должно занять несколько часов. Вы должны получить улучшение путем транспонирования второй матрицы (около 30%), но на самом деле это не должно занимать часы.

Так что, когда вы 2х N, вы увеличиваете время на 8х. Хуже того, матрица, которая вписывается в ваш кэш, очень быстрая, но требует больше, чем несколько МБ, и они должны исходить из основной памяти, что замедляет ваши операции еще в 2-5 раз.

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

Я попробовал Jama, которая является очень простой библиотекой, в которой вместо одного используются двумерные массивы, а 4-летнему labtop потребовалось 7 минут. Вы должны быть в состоянии получить половину этого времени, просто используя новейшее оборудование и с несколькими потоками сократить это менее одной минуты.

РЕДАКТИРОВАТЬ: Используя Xeon X5570, Джама умножил две матрицы 5000x5000 за 156 секунд. Используя параллельную реализацию, которую я написал, сократите это время до 27 секунд.

2 голосов
/ 28 августа 2010

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

Вы могли бы потратить много времени на «исправление» того, что не является проблемой. Я подозреваю, что файл ввода-вывода, который вы предлагаете, на самом деле замедлит ваш код.

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

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

1 голос
/ 28 августа 2010

Используйте профилировщик в jvisualvm в JDK, чтобы определить, на что тратится время.

Я бы провел несколько простых экспериментов, чтобы определить, как масштабируется ваш алгоритм, потому что, похоже, вы можете использовать тот, который имеет более сложную среду выполнения, чем вы думаете. Если он выполняется в N ^ 3 (что обычно, если вы хотите умножить список на массив), то удвоение размера ввода увеличит время выполнения в восемь раз.

...