2016-04-27 5 views
1

У меня есть программа Java, которая просто считывает 12 Гбайт файлВремя, необходимое для чтения файла из буферного кэша жесткого диска или ОС или RAM-диска является почти таким же

Reader reader1 = new FileReader(filePath); 
     try (BufferedReader bufferedReader = new BufferedReader(reader1)) { 
      String line = bufferedReader.readLine(); 
      while (line != null) { 
       line = bufferedReader.readLine(); 
      } 
     } 

Это занимает около 53 секунд, чтобы прочитать файл для первый раз.

Затем я проверил, был ли файл кэширован или нет, используя RAMMAP, файл полностью кэширован и находится в резервном списке.

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

Я также создал RAM RAM, скопировал входной файл в RAM DISK, затем снова запустил вышеуказанный код, даже теперь это заняло около 54 секунд. Когда RAM IOPS намного быстрее, почему он здесь не отражается

+0

Попробуйте запустить эту программу после перезагрузки ОС. Файл может быть кэширован даже при первой попытке. Другим вариантом является то, что ваш HD достаточно быстр для последовательных операций чтения, и это фактически обработка java readLine, которая является узким местом. Пожалуйста, посмотрите, как использовать java-программу для использования в Java при ее запуске. –

+0

@ArturBiesiadowski, я очистил файл из кеша с помощью RAMMAP. Загрузка процессора составляет от 4 до 6%, это 2 процессора и 24 ядра. – i0707

+0

Кажется, что процессор является узким местом. Попробуйте, возможно, разделить файл и загрузить его несколькими потоками параллельно? – gudok

ответ

1

12GB - это 12 000 000 000 байт данных. Предполагая, что строка в вашем файле составляет 100 байт в среднем, это 120 000 000 строк. Что означает 120 миллионов итераций вашего цикла. 53 секунды выглядит неплохо, не так ли?

Существует 120 миллионов экземпляров строк, которые необходимо собрать мусором. Есть 120 миллионов вызовов readline и 120 миллионов memcpys. 53 секунды кажутся достаточно справедливыми, и это похоже на немного кода, который не полностью связан с IO.

И BufferedReader работает медленно. Очень медленно. См. Этот ответ: Why is the performance of BufferedReader so much worse than BufferedInputStream?

+1

, хотя это быстрее, то какова цель кеширования файла ОС (windows), если кэширование предназначено для повышения производительности, тогда в этом случае должно быть хотя бы некоторое улучшение, чего не было – i0707

+0

см. мой обновленный ответ – e4c5

1

Предварительная выборка.

Вы читаете файл последовательно. Ваш диск достаточно быстр, чтобы обеспечить 12 ГБ/53 с = 226 МБ/с. После прочтения его части ОС предполагает, что вам понадобится больше и больше, и читает следующие патроны в память, чтобы они были доступны по мере необходимости.

Скорость - это максимум необходимого ЦП и необходимого времени ввода-вывода. Процессору требуется 53s, диск не медленнее. Ваша задача связана с CPU.

Когда ОЗУ IOPS намного быстрее, почему это не отражается здесь.

Прочитано 12 ГБ из случайных позиций или из многих файлов, и вы увидите, насколько медленным может быть диск. В вашем случае продолжительность вычисляется как максимум и max(53, 1) == max(53, 53).

+0

, даже если файл читается последовательно, почему нет разницы в производительности между RAM DISK и жестким диском. Как вы сказали, мой жесткий диск доставляет 226 МБ/с, но мой бенчмарк с RAM DISK дает в 8 раз большую скорость, чем HD. Это из-за какого-то ограничения в java, которое полностью не использует RAM DISK? – i0707

+0

Вы можете продумать это «продолжительность вычисляет как максимум и максимум (53, 1) == max (53, 53)». – i0707

+0

@ i0707 Благодаря предварительной выборке операции (почти) идеально перекрываются. Программе требуется процессор на 53 секунды и меньше времени ввода-вывода. Не имеет значения, требуется ли IO 53 секунды (что вполне возможно с пластинами) или 1 секунду (что вполне возможно с ramdisk). Вам всегда нужно как минимум 53 секунды (вы бы больше, если бы HD обеспечил менее 226 МБ/с). Это мое максимальное уравнение. Время не добавляется, максимум прав. – maaartinus