2012-03-02 3 views
0

В настоящее время я делаю проект по обработке звука, в нем требуется умножить матрицы, содержащие данные звуков, т. Е. амплитуды, мне приходится обрабатывать матрицу, в основном выполнять умножение, но количество элементов в матрице слишком велико ... она приближается к примерно 120000 элементам из файла .wav от 600 КБ.Матричное умножение в java для размерной матрицы большого размера

Так что, когда я выполнить умножение дает мне исключение как ...

Исключение в потоке «основной» java.lang.OutOfMemoryError: Java куча пространства

Пожалуйста, предложите мне решение ...

+0

Можете ли вы разбить это на более мелкие матрицы? Запуск математической матрицы на матрице такого размера приведет к очень низкой производительности (даже если вы ее получите в пределах памяти) – jzworkman

+0

вам требуется иметь всю матрицу в памяти? не могли бы вы просто размножаться в чанках, читать из файла и выводить результаты в другой файл? – vulkanino

+0

Близко связанный - http://stackoverflow.com/questions/4633859/optimizing-processing-and-management-of-large-java-data-arrays –

ответ

0

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

Я бы предложил использовать VisualVM, чтобы понять, почему вы используете так много памяти. Вы можете найти проблему, просто посмотрев на метод, который вызывает ошибку (т. Е. Посмотрите на трассировку стека).

Скажите, что вы должны использовать 120 000 float для вашей амплитуды, то есть 480 КБ, которая будет исправлена ​​на большинстве мобильных телефонов. BTW: Вы делаете это по телефону?

0

Есть две возможности:

  1. Вы пытаетесь создать большую матрицу случайно. Например, умножение матрицы не является коммутативным, а A*B может иметь очень разного размера, чем B*A. Расположение исключения должно дать четкое представление о том, где искать ошибки в коде.
  2. Ваш алгоритм действительно должен создать огромную матрицу. Есть несколько способов попробовать и решить эту проблему:
    • предоставить больше ОЗУ для JVM;
    • вместо того, чтобы хранить всю огромную матрицу в памяти сразу, измените код так, чтобы вы сохраняли только часть его в любой момент времени;
    • пытаются использовать структуру матрицы (например, разреженность).
Смежные вопросы