Слишком медленное чтение большого файла на Java, превышен предел накладных расходов gc

У меня есть большой файл (примерно 3 ГБ), и я прочитал его в ArrayList. Когда я запускаю приведенный ниже код, через несколько минут код запускается очень медленно, а загрузка ЦП высока. через несколько минут консоль eclipse покажет ошибку java.lang.OutOfMemoryError: превышен предел накладных расходов GC.

  • ОС: windows2008R2,
  • 4 чашки,
  • 32 ГБ памяти
  • версия java "1.7.0_60"

eclipse.ini

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140116-2212
-product
org.eclipse.epp.package.standard.product
--launcher.defaultAction
openFile
#--launcher.XXMaxPermSize
#256M
-showsplash
org.eclipse.platform
#--launcher.XXMaxPermSize
#256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms10G
-Xmx10G
-XX:+UseParallelGC
-XX:ParallelGCThreads=24
-XX:MaxGCPauseMillis=1000
-XX:+UseAdaptiveSizePolicy

код Java:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("/words/wordlist.dat")));        
            InputStreamReader isr = new InputStreamReader(bis,"utf-8");
            BufferedReader in = new BufferedReader(isr,1024*1024*512);

            String strTemp = null;
            long ind = 0;

            while (((strTemp = in.readLine()) != null)) 
            {
                matcher.reset(strTemp);

                if(strTemp.contains("$"))
                {
                    al.add(strTemp);
                    strTemp = null;
                }
                ind = ind + 1;
                if(ind%100000==0)
                {
                    System.out.println(ind+"    100,000 +");
                }

            }
            in.close();

мой вариант использования:

neural network
java
oracle
solaris
quick sort
apple
green fluorescent protein
acm
trs

person pangjiale    schedule 27.02.2016    source источник
comment
Не могли бы вы уточнить свой вариант использования? Зачем нужен файл 3gb в памяти?   -  person Mahendra    schedule 27.02.2016
comment
Это необходимо для загрузки всего файла в память?   -  person Devavrata    schedule 27.02.2016
comment
Вы можете временно предотвратить эту проблему, установив -XX:-UseGCOverheadLimi в конфигурации eclipse: disable-the-usegcoverheadlimit-in-centos   -  person Mahendra    schedule 27.02.2016
comment
почему бы не увеличить размер кучи JVM (не eclipse!) до примерно 6 ГБ? Вам явно хватит барана;)   -  person Thomas Jungblut    schedule 27.02.2016
comment
@haraldK, но это для eclipse, а не для JVM, которую он запускает   -  person Thomas Jungblut    schedule 27.02.2016
comment
Я пишу программу на Java, чтобы получить статистику о том, сколько раз ключевое слово было найдено в списке журнала поисковых слов   -  person pangjiale    schedule 27.02.2016
comment
может быть, Томас Юнгблут прав, я попробую, тот же код на solaris, используя командную строку, работает.   -  person pangjiale    schedule 27.02.2016
comment
Могли бы вы точно сказать, чего хотите достичь?   -  person Krzysztof Cichocki    schedule 27.02.2016
comment
Зачем нужно читать весь файл в память? Почти все вычислительные проблемы, включая компиляцию, могут быть решены за один проход по файлу, читая его построчно, или запись за записью, или символ за символом в случае компиляции.   -  person user207421    schedule 27.02.2016


Ответы (1)


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

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

Используя потоки Java 8, вы можете сделать это в одну или две строки, не загружая сразу весь файл в память.

try (Stream<String> s = Files.lines(Paths.get("filename"))) {
    Map<String, Long> count = s.flatMap(line -> Stream.of(line.trim().split(" +")))
            .collect(Collectors.groupingBy(w -> w, Collectors.counting()));
}
person Peter Lawrey    schedule 27.02.2016