Как хранить (и читать) большие массивы / карты / что угодно в Java? - PullRequest
2 голосов
/ 17 июля 2010

Может кто-нибудь помочь мне со следующей проблемой? Мне нужно постоянно сохранять то, что у меня сегодня есть в массивах, чтобы потом использовать данные для расчетов. Я объясняю пример ниже.

1, я генерирую длинный [] [], который слишком велик для оперативной памяти моего компьютера. Генерируется одна строка за другой.

2, я что-то вычисляю из своего long [] [] и сохраняю результаты в двойном [] [] - тоже слишком большой для моей оперативной памяти. Мне не нужен весь long [] [] в одно и то же время, так как небольшая партия строк используется в вычислениях одновременно, и одна строка в double [] [] заполняется для каждой партии.

3, мне нужно отсортировать двойные [] [] и делать много других вещей, не важных здесь.

4, я повторяю шаги 2 и 3 в нескольких итерациях (крупно,> 10000), что означает, что я забочусь о скорости доступа и сортировки.

Я знаю размер массивов, но, очевидно, я не могу инициализировать их, так как они слишком велики, а также потому, что он должен быть инициализирован с помощью int (пока я могу выполнять только «небольшие» вычисления). Конечно, я могу использовать Карты и т. Д., Но мне не удалось заставить это работать, и я не понимаю, какие виды я должен использовать. Я никогда не использовал карты / коллекции и т.д. В последнем случае я могу использовать один из столбцов в массивах в качестве ключей, так как они идентичны (кроме типа). Ключом может быть просто номер строки (выраженный как long).

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

Я более чем благодарен за любую помощь и совет!

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

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

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

Альтернативой является использование пользовательской реализации Map, которая сбрасывает данные во вторичное хранилище всякий раз, когда их размер увеличивается больше порогового значенияопределяется вами.Для этой цели доступно несколько стратегий: FIFO, LIFO, LRU и т. Д. Также всякий раз, когда вам нужно получить доступ к определенному элементу карты, вы снова можете загрузить большую часть соседних элементов с диска (или снова использовать стратегию, котораябольше подходит для вашего случая использования), чтобы уменьшить чрезмерный дисковый ввод-вывод.

1 голос
/ 17 июля 2010

Для хранения этих данных вы можете использовать netcdf или hdf5 . Вы можете получить и сохранить подмножества массивов.

0 голосов
/ 20 июля 2010

Управление подмножеством данных, вероятно, будет лучшим решением.

Однако вам следует спросить себя, используете ли вы подходящий компьютер для этой работы.Вы можете купить новый ПК Core 2 Duo 2,5 ГГц с 4 Гб памяти за £ 225.Вы можете купить четырехъядерный процессор AMD с 8 ГБ за £ 380.Вы можете купить 16 ГБ памяти за £ 320.

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

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