9

Я должен прочитать большой файл, и прежде чем я начну его читать, мне нужно знать общее количество строк в файле (в миллионах).

Я реализовал много решений и нашел одно. Но во время поисков я подумал посмотреть, как работает wc -l . Я не смог ничего найти в Google.

Хотя я нашел решение своей проблемы, я все же хотел бы знать, как работает wc -l поскольку он может вычислить количество строк в файле с 92 миллионами строк за несколько секунд!

Как?

3 ответа3

19

Он читает весь файл и считает количество концов строки. Подсчет концов строк действительно дешев; большая часть времени тратится на чтение файла. Если файл окажется (в основном) в буферном кеше, это тоже будет дешево. В противном случае это будет зависеть от скорости вашего файлового хранилища.

Другими словами, нет магии.

7

WC просто читает файл в блоках необработанных байтов (предпочтительно в кратных натурального размера блока базовой файловой системы, в которой находится файл).
Затем он просто просматривает буфер, считая символы конца строки. (Он также подсчитывает пробелы, вкладки, форматы и другие специальные символы на тот случай, если вам нужна другая информация, кроме вывода -l.)

Чтение с диска является дорогостоящей частью с точки зрения скорости. Сканирование буфера занимает незначительное время по сравнению с этим.

Скажем, у вас 90 миллионов строк, в среднем по 100 символов в строке.
Это около 9 000 000 000 символов или около 860 МБ.
Приличный ПК с диском SATA-3Gb/s сделает это менее чем за 10 секунд. Даже на относительно медленной файловой системе, где одновременно происходит какая-то другая деятельность.
Быстрая машина с некоторой настройкой производительности и оптимизированной файловой системой может сделать это менее чем за 5 секунд, даже не прибегая к SATA-6G и SSD-накопителю.

3

Добро пожаловать в мир свободного программного обеспечения. Вы всегда можете посмотреть на исходный код

Хотя я должен признать, что я не программист на Си, поэтому я не тот, кто действительно может объяснить код для вас (и я был бы заинтересован сам).

Что я знаю, так это то, что wc не открывает сам файл, а просит ОС сделать это, в значительной степени это зависит от ОС и, конечно, от того, как файл хранится. Кроме того, я ожидаю, что должны быть правильные методы программирования, например, не пытаться прочитать файл целиком и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .