Читая большой текстовый файл с помощью BufferedReader, насколько сильно печать каждой строки замедляет процесс? - PullRequest
0 голосов
/ 25 марта 2019

Я создал программу для чтения очень большого текстового файла (2,5 ГБ) и перезаписи каждой строки в новый текстовый файл, отформатированный так, как мне хотелось бы. Все идет хорошо, но когда я написал это, я поместил немного println, где он читает строку для целей тестирования, чтобы проверить, работает ли он правильно. Все прошло хорошо, поэтому я запустил его и ушел от компьютера, вернулся через 3 часа и увидел, что я оставил там сообщение об отладке. Мой вопрос: насколько сильно это замедляет меня, если я читаю / пишу примерно 46 000 000 строк? Было бы разумно остановить это так далеко, чтобы удалить его?

Ответы [ 3 ]

1 голос
/ 25 марта 2019

хорошо, я бы предположил, что это примерно удвоит ETA, так как вы в основном создаете еще одну копию файла в своем журнале; -)

Проверьте, как далеко вы продвинулись - затем подумайте об убийствепроцесс ....

0 голосов
/ 25 марта 2019

За весь процесс отвечают две вещи:

  1. Процессор
  2. Устройство ввода-вывода

Изначально, когда вы копируете строки из одного файлас другой стороны, в процесс не вовлечено устройство ввода-вывода (поскольку вы не печатали ни одной строки).Таким образом, нет времени ожидания для процессора.Следовательно, процесс завершился за меньшее время.

Когда вы ввели оператор println , для каждой строки, которую ЦП читает из первого файла, он должен отправить эту строку на устройство ввода-вывода для печати.,После отправки линии на устройство ввода-вывода ЦПУ должен дождаться завершения работы.Как только устройство ввода-вывода завершит печать, процессор продолжит процесс и вставит эту строку во второй файл.Этот процесс будет продолжаться до тех пор, пока все строки в первом файле не будут скопированы во второй файл.

Таким образом, для каждой строки в файле ЦП должен ждать определенное количество времени.Это первая причина увеличения времени обработки.Во-вторых, при печати ввода-вывода создается еще одна копия файла.Итак, теперь вы создаете 2 копии вместо одной.

46 000 000 строк?

Let's take the time taken by each operation in the process is 1 microsecond.Initially - 

Time took by CPU to copy a line = 1 microsecond
Time took by CPU to paste a line = 1 microsecond
Total time for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time of the entire process = 92 sec.

Введено

Time took by CPU to copy a line = 1 microsecond
Time took by IO to paste a line = 1 microsecond
Time took by CPU to paste a line = 1 microsecond
Waiting time of CPU for every line = 1 microsecond

Total time taken by CPU for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Total time taken by IO for copying 46,000,000 lines = 46,000,000 microsecond = 46 sec
Waiting time of CPU = 46,000,000 microsecond = 46 sec
Total time by CPU for pasting 46,000,000 lines = 46,000,000 microsecond = 46 sec

Total time of the entire process = 184 sec.

Надеюсь, это ответит на ваш запрос!

0 голосов
/ 25 марта 2019

Дополнительные затраты на отладку println очень зависят от платформы.

Если ваш PrintStream направлен на консоль, вы можете замедлиться за счет дополнительной обработки, связанной с консолью. В Windows консоль по умолчанию невероятно медленная, в Linux такая большая.

Кроме того, если вы используете System.out / System.err, ваш PrintStream будет настроен на сброс после каждого println добавления дополнительных издержек.

3 часа, чтобы обработать 2,5 ГБ на диске очень медленно. Таким образом, либо выполнение вашего кода является чем-то сложным, и дополнительная строка отладки оказывает небольшое влияние на общую производительность, либо вы выполняете запись в Windows на консоль по умолчанию (в дальнейшем отладка println представляет собой огромную проблему).

...