Я должен прочитать большой файл, и прежде чем я начну его читать, мне нужно знать общее количество строк в файле (в миллионах).
Я реализовал много решений и нашел одно. Но во время поисков я подумал посмотреть, как wc -l
работает. Я не смог ничего найти в Google.
Хотя я нашел решение своей проблемы, я все же хотел бы знать, как это wc -l
работает, так как он может рассчитать количество строк файла с 92 миллионами строк за несколько секунд!
Как?
Ответы:
Он читает весь файл и считает количество концов строки. Подсчет концов строк действительно дешев; большая часть времени тратится на чтение файла. Если файл окажется (в основном) в буферном кеше, это тоже будет дешево. В противном случае это будет зависеть от скорости вашего файлового хранилища.
Другими словами, нет волшебства.
источник
WC просто читает файл в блоках необработанных байтов (предпочтительно в кратных натурального размера блока базовой файловой системы, в которой находится файл).
Затем он просто просматривает буфер, считая символы конца строки. (Он также подсчитывает пробелы, вкладки, каналы и другие специальные символы, на тот случай, если вам нужна другая информация, кроме вывода -l.)
Чтение с диска является дорогостоящей частью с точки зрения скорости. Сканирование буфера занимает незначительное время по сравнению с этим.
Скажем, у вас 90 миллионов строк, в среднем по 100 символов в строке.
Это около 9 000 000 000 символов или около 860 МБ.
Приличный ПК с диском SATA-3Gb / s сделает это менее чем за 10 секунд. Даже на относительно медленной файловой системе, где одновременно происходит какая-то другая деятельность.
Быстрая машина с некоторой настройкой производительности и оптимизированной файловой системой может сделать это менее чем за 5 секунд, даже не прибегая к SATA-6G и SSD-накопителю.
источник
\n
символы конца строки ( ) - "-l, --lines печатает счетчик новой строки \ n \" - извлечено изwc.c
wc -l
.. извините ...Добро пожаловать в мир свободного программного обеспечения. Вы всегда можете посмотреть на исходный код
Хотя я должен признать, что я не программист на Си, поэтому я не тот, кто действительно может объяснить код для вас (и я был бы заинтересован сам).
Что я знаю, так это то, что wc не открывает сам файл, а просит ОС сделать это, во многом это зависит от ОС и, конечно, от того, как файл хранится. Кроме того, я ожидаю, что должны быть правильные методы программирования, например, не пытаться прочитать файл целиком и т. Д.
источник