Выяснение самого большого массива, который я могу создать в памяти - PullRequest
0 голосов
/ 29 сентября 2011

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

Я знаю о Runtime.FreeMemory, но как мне его использовать?,Должен ли я тщательно выяснить, какие другие переменные я использую в программе, а затем создать массив размера (freeMemory - variableSizes), или это слишком вероятно может пойти не так?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 29 сентября 2011

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

Возможно, лучше подойдет некоторый адаптивный подход (тестирование количества отсортированных элементов / секунду в зависимости от размера массива) и корректировка.за то, что вы можете уместить, не получая OutOfMemoryError.

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

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

0 голосов
/ 29 сентября 2011

Если вы используете функциональность сортировки Java, вы должны будете использовать коллекцию некоторого вида, которая не будет принимать типы примитивов, а, скорее, вам придется использовать объекты Integer. (List<Integer>)

В моем опыте (не считаться Евангелием) int весит (очевидно) 4 байта ОЗУ, тогда как Integer весит 12 байтов на 32-битной машине и 24 байта на 64-битной машине.

Если вам нужно уменьшить отпечаток памяти, используйте int [], а затем внедрите свой собственный сортировщик ... Однако может быть проще использовать List<Integer> и встроенные функции сортировки и просто иметь дело с большим количеством списков меньшего размера.

Чтобы ответить на этот вопрос, вам обязательно нужно взглянуть на угол атаки Merge-Sort для этой проблемы и просто выбрать произвольный размер списка для начала. После некоторых экспериментов вы, вероятно, обнаружите, что существует компромисс между размером списка и количеством кусков. Найди подходящее место и расскажи нам о своих результатах!

0 голосов
/ 29 сентября 2011

Я думаю, что вычисление точно того, сколько памяти мы можем выделить, является слабым делом, так как по умолчанию в java jvm выделит пространство кучи 256M, но это всегда можно увеличить с помощью -Xmx,так что лучше поменять производительность на переносимость, имея фиксированный размер фрагмента, скажем, около 150M.

0 голосов
/ 29 сентября 2011

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

...