Создание очень большого массива Java

Если вы хотите пойти по пути Kafka, есть несколько вариантов получения данных из SQL Server в Kafka:

Однажды данные в Kafka вы можете передать в Postgres (или любую другую базу данных), используя приемник kafka-connect-jdbc .

10
задан Michael Myers 23 March 2009 в 16:52
поделиться

14 ответов

Можно хотеть расширить макс. размер "кучи" JVM. Можно сделать это с параметром командной строки.

Я полагаю, что это-Xmx3600m (3 600 мегабайтов)

12
ответ дан 3 December 2019 в 13:30
поделиться

Используйте файл с отображенной памятью (пакет Java за 5 NIO) вместо этого. Или переместите решето в небольшую библиотеку C и используйте Java JNI.

-2
ответ дан 3 December 2019 в 13:30
поделиться

Вы могли обойтись 900 миллионами битов? (возможно, сохраненный как массив байтов).

0
ответ дан 3 December 2019 в 13:30
поделиться

Используйте Корпус Токио, Беркли DB или любое другое находящееся на диске хранилище значения ключа. Они быстрее, чем какая-либо стандартная база данных, но позволяют Вам использовать диск вместо памяти.

0
ответ дан 3 December 2019 в 13:30
поделиться

Я идея второго @sfossen и @Aaron Digulla. Я пошел бы для доступа к диску. Если Ваш алгоритм может взять в интерфейсе List, а не простом массиве, Вы могли бы записать адаптер от Списка до файла с отображенной памятью.

0
ответ дан 3 December 2019 в 13:30
поделиться

Я записал версию Решета Эратосфена для Euler Проекта, который работал над блоками пространства поиска за один раз. Это обрабатывает первое 1M целые числа (например), но сохраняет каждое простое число, которое это находит в таблице. После итерации по всем началам, найденным до сих пор массив повторно инициализируется, и начала найдены, уже используются для маркировки массива перед поиском следующего.

Таблица отображает начало на свое 'смещение' от запуска массива для следующего повторения обработки.

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

Этот метод также обеспечивает memoisation для более поздних повторений по простым числам. Это быстрее, чем сканирование Вашей редкой структуры данных решета, ища тех каждый раз.

0
ответ дан 3 December 2019 в 13:30
поделиться

Вы могли определить свой собственный класс, который хранит данные в 2-м массиве, который был бы ближе к sqrt (n) sqrt (n). Затем используйте индексную функцию для определения двух индексов массива. Это может быть расширено на большее количество размеров по мере необходимости.

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

1
ответ дан 3 December 2019 в 13:30
поделиться

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

1
ответ дан 3 December 2019 в 13:30
поделиться

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

6
ответ дан 3 December 2019 в 13:30
поделиться

То, под чем Вы подразумеваете, "не позволит". Вы, вероятно, добираясь OutOfMemoryError, поэтому добавьте больше памяти с -Xmx параметр командной строки.

2
ответ дан 3 December 2019 в 13:30
поделиться

900 миллионов 32 битов ints без дальнейших издержек - и всегда будет, больше служебное - потребовало бы немногим более, чем 3,35 гибибайт. Единственный способ получить так много памяти с JVM на 64 бита (на машине по крайней мере с 8 ГБ RAM), или используйте поддержанный кэш некоторого диска.

7
ответ дан 3 December 2019 в 13:30
поделиться

Java позволит до 2 миллиардов записей массива. Именно Ваша машина (и Ваша ограниченная память) не могут обработать такую большую сумму.

10
ответ дан 3 December 2019 в 13:30
поделиться

Массивы Java индексируются интервалом, таким образом, массив не может стать больше, чем 2^31 (нет никаких неподписанных ints). Так, максимальный размер массива равняется 2147483648, который использует (для простого интервала []) 8589934592 байта (= 8 ГБ).

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

В Вашем алгоритме необходимо использовать Список (или Карта) как структура данных и выбрать реализацию Списка (или Карта), который может вырасти вне 2^31. Это может стать хитрым, начиная с "обычной" реализации ArrayList (и HashMap) массивы использования внутренне. Необходимо будет реализовать пользовательскую структуру данных; например, при помощи 2-уровневого массива (список/массив). Когда Вы в нем, можно также попытаться упаковать биты более плотно.

10
ответ дан 3 December 2019 в 13:30
поделиться

Если Ваш алгоритм позволяет его:

  • Вычислите его в частях, которые вписываются в память.

    Необходимо будет восстановить вычисление для каждой части, но это часто будет достаточно быстро.

  • Используйте массив меньшего числового типа, такого как байт.

1
ответ дан 3 December 2019 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: