2009-09-29 2 views
0

Я работаю с большой матрицей (не разреженной), она содержит около 10^10 double. Конечно, я не могу сохранить его в памяти, и мне нужно всего лишь 1 строку во времени.Правильный способ управления большой матрицей в Java

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

ответ

1

Почему вы хотите сохранить его в разных местах? Не можете ли вы использовать один файл?

Вы можете использовать функции внутри класса RandomAccessFile для выполнения чтения из этого файла.

+0

Вы правы, RandomAccessFile может быть лучшим решением. – BigG

+0

спасибо. :) Дайте ему попробовать. – vpram86

0

Итак, 800 КБ в файл, звучит как хорошее разделение. Конечно, ничто не мешает вам использовать один гигантский файл. Матрица, как минимум одна, такая же, как ваша, которая не является разреженной, может считаться файлом записей фиксированной длины, делая случайный доступ тривиальным вопросом.

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

Соображения один путь или другой ...

  • в это время резервного копирования? У вас есть резервные носители большой емкости или что-то обычное?
  • этот файл когда-либо изменился?
  • если он изменился, и он был скопирован, он меняет все сразу или изменения локализованы?
+0

он не меняется, и у меня много свободного места на моем жестком диске. – BigG

+0

Если он не изменился, я предполагаю, что он также не нуждается в резервном копировании. Я думаю, что согласен с Aviator, похоже, что один большой файл - это путь. – DigitalRoss

0

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

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

+0

Право, я забыл написать об этом в моем вопросе, извините! – BigG

0

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

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

+0

нет, мне просто нужно 1 строка – BigG

0

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

Другой подход, который приходит мне на ум, заключается в использовании Terracotta (который к тому времени недавно приобрел Ehache). Это здорово, если вы получите большую сетевую кучу, которая может легко управлять вашими 10^10 двойными значениями, не заботясь об этом в коде вообще.

Смежные вопросы