Próbowałem innych odpowiedzi wymienione powyżej, ale są one bardzo dalekie od przyzwoitych rozwiązań gdy mamy do czynienia z dużymi plikami - zwłaszcza gdy rozmiar jednej linii zajmuje więcej niż ~ 1/4 dostępnej pamięci RAM.
Zarówno bash, jak i awk sypią całą linią, mimo że dla tego problemu nie jest potrzebna. Bash spowoduje błąd, gdy linia będzie zbyt długa, nawet jeśli masz wystarczająco dużo pamięci.
Wdrożyłem niezwykle prosty, dość niezoptymalizowany skrypt Pythona, który podczas testowania z dużymi plikami (~ 4 GB na linię) nie ulega slurpowi i jest zdecydowanie lepszym rozwiązaniem niż podane.
Jeśli jest to kod czasowo krytyczny dla produkcji, możesz przepisać pomysły w C lub wykonać lepszą optymalizację w wywołaniu odczytu (zamiast czytania tylko jednego bajtu na raz), po przetestowaniu, czy to rzeczywiście wąskie gardło.
Kod zakłada, że znak nowej linii jest znakiem prostym, co jest dobrym założeniem dla systemu Unix, ale YMMV dla systemu Mac OS/Windows. Upewnij się, że plik kończy się na linii, aby mieć pewność, że liczba znaków ostatniego wiersza nie zostanie przeoczona.
from sys import stdin, exit
counter = 0
while True:
byte = stdin.buffer.read(1)
counter += 1
if not byte:
exit()
if byte == b'\x0a':
print(counter-1)
counter = 0
Pierwsza zasada tworzenia oprogramowania: "nie" oznacza "nie". Użyj "num" lub "number". –
[potrzebne źródło]. – uprego