Можно поддерживать отдельный сторожевой процесс в рабочем состоянии. Его единственная задача смотрит, пространство текущего процесса для определения ситуаций как Вы описывают. Это могло даже повторно запустить исходное приложение после катастрофического отказа или предоставить различные возможности пользователю, собрать отладочную информацию и т.д. Просто попытайтесь сохранить его достаточно простым так, чтобы Вам не был нужен второй сторожевой таймер для наблюдения первого.
Вы можете попробовать две вещи:
Сделать так, чтобы ваш метод hashCode
возвращал что-то более простое и эффективное, например, последовательный int
Инициализируйте вашу карту как:
Карта карты = новая HashMap (30000000, .95f);
Эти два действия значительно сократят объем перефразирования структуры, и я думаю, что их довольно легко проверить.
Если это не сработает, рассмотрите возможность использования другого хранилища, такого как СУБД.
ИЗМЕНИТЬ
Странно, что установка начальной емкости снижает производительность в вашем случае.
См. Из javadocs :
Если начальная емкость больше, чем максимальное количество записей, разделенное на коэффициент загрузки, никаких операций повторного хеширования не произойдет.
Я сделал микропляж (который ни в коем случае не является окончательным, но, по крайней мере, доказывает этот момент)
$cat Huge*java
import java.util.*;
public class Huge {
public static void main( String [] args ) {
Map map = new HashMap( 30000000 , 0.95f );
for( int i = 0 ; i < 26000000 ; i ++ ) {
map.put( i, i );
}
}
}
import java.util.*;
public class Huge2 {
public static void main( String [] args ) {
Map map = new HashMap();
for( int i = 0 ; i < 26000000 ; i ++ ) {
map.put( i, i );
}
}
}
$time java -Xms2g -Xmx2g Huge
real 0m16.207s
user 0m14.761s
sys 0m1.377s
$time java -Xms2g -Xmx2g Huge2
real 0m21.781s
user 0m20.045s
sys 0m1.656s
$
Таким образом, использование начальной емкости снижается с 21 до 16 из-за перефазировки. Это оставляет нам ваш метод hashCode
в качестве «области возможностей»;)
EDIT
Согласно вашему последнему выпуску.
Я думаю, вам действительно стоит профилировать свое приложение и посмотреть, где оно используется память / процессор.
Я создал класс, реализующий ваш тот же hashCode
Этот хэш-код дает миллионы коллизий, затем количество записей в HashMap резко сокращается.
Я перехожу с 21 до 16 в предыдущем тесте на 10 и 8. Причина в том, что хэш-код вызывает большое количество коллизий, и вы сохраняете не 26 миллионов объектов, как вы думаете, а гораздо меньшее количество (я бы сказал, около 20 тысяч) Итак:
Проблемы НЕ ХЭШ-КАРТА где-то еще в вашем коде.
Пора получить профилировщик и выяснить, где именно. Я бы подумал, что это связано с созданием элемента или, возможно, вы записываете на диск или получаете данные из сети.
Здесь '
Когда вы запишете макрос, вы увидите, что формат задается строкой .TextFileColumnDataTypes = Array (2, 2, 2)
, где 2 задает формат текста, а 3 элемента в массиве относятся к 3 столбцам . Вы можете настроить массив так, чтобы он содержал больше элементов, чем количество столбцов, которые вы ожидаете иметь в ваших текстовых файлах, так как любые лишние будут игнорироваться.
Вы можете нажать F8, чтобы запустить диалоговое окно макроса, которое сокращает процесс до такой степени, что он '; s аналогично открытию из меню файла (хотя все же не так удобно, как возможность двойного щелчка по файлу).
Я нашел полезный пример макроса с некоторыми дополнительными пояснениями здесь
Это более подробно e объяснение того, что делают соответствующие настройки, например, установка правильного разделителя в макросе и т. д.
Если у вас есть возможность, вы можете сохранить данные в электронную таблицу XML (я знаю, эти файлы очень быстро становятся большими) - чтобы открыть ее, просто перетащите ее в открытое окно Excel. Это единственный известный мне способ получить желаемый результат. - Это полезно только для небольших и средних наборов данных.