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

У меня есть большой файл (примерно 3 ГБ) и я прочитал его в ArrayList. Когда я запускаю приведенный ниже код, через несколько минут код запускается очень медленно и загрузка ЦП высока. через несколько минут на консоли затмения отобразится ошибка 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

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()));
}
Другие вопросы по тегам