Mam program, w którym bardzo często muszę zapisywać wiersze tekstu do pliku dziennika. Chciałbym ograniczyć liczbę linii w pliku dziennika do 1000. Kiedy piszę linie do pliku, powinien on dołączyć je normalnie. Gdy plik osiągnie 1000 linii, chciałbym pozbyć się pierwszej linii, a następnie dołączyć nową. Czy ktoś wie, czy istnieje sposób, aby to zrobić bez przepisywania całego pliku za każdym razem?Algorytm zapisu ograniczonej liczby linii do pliku tekstowego
Odpowiedz
Za każdym razem, gdy chcesz się zalogować, możesz otworzyć plik, odczytać indeks zapisu, przeskoczyć do pozycji i wpisać wpis dziennika o stałej szerokości. Kiedy indeks osiągnie górny próg, po prostu ustaw go ponownie na 0.
Istnieje jednak wiele ostrzeżeń - po pierwsze, każdy prawidłowy wpis w dzienniku (zakładając, że zamkniesz plik pomiędzy) będzie wymagał otwarcia, przeczytania, poszukiwania, napisania, poszukiwania, napisania i zamknij - aby znaleźć swój indeks, przejdź do niego, napisz nowy wpis, a następnie zaktualizuj swój indeks. Masz również nieodłączne problemy z pisaniem elementu danych o stałym rozmiarze. Ponadto, ludzki czytelnik będzie zależał od twoich treści, aby wiedzieć, gdzie jest "początek" pliku. Większość ludzi oczekuje, że "linia 1" będzie pierwszą linią.
Jestem znacznie większym zwolennikiem po prostu posiadania kilku plików i "zwijania" ich, tak aby każdy plik sam był spójny, ale jeśli chcesz tylko jeden plik z ustaloną liczbą linii, okrągły bufor pomysł może zadziałać.
@ user2848097 Myślę, że masz lepszy pomysł, jak sprawić, by było to wydajniejsze niż ja, ale jeśli ci pomogło, cieszę się. –
Zatrzymuję każdy wiersz tekstu w okrągłym buforze. Śledzę ostatni indeks i używam go, aby określić kolejność zapisywania ich w pliku. Jest zaskakująco wydajny, nawet z 1000 linii. Dzięki! –
Ogólnie rzecz biorąc, w przypadku takiego przypadku lepiej jest usunąć więcej niż jedną linię naraz.
Oznacza to, że jeśli twój limit wynosi 1000 linii, a ty trafisz 1000 linii, usuń pierwszych 300 lub więcej, a następnie wznów pisanie. W ten sposób nie wykonujesz operacji usuwania z każdą kolejną linią napisaną później, tylko co 300 razy. Jeśli potrzebujesz utrzymywać 1000 linii, zamiast tego zachowaj do 1300 i usuń 300 po osiągnięciu 1300.
Wszystkie pliki należy wyrównać do rozmiaru klastra FS. Tak, nie, nie ma mowy. Możesz dołączyć linię do pliku, ale nie możesz usunąć pierwszej linii bez przepisywania pliku. Możesz użyć 2 plików po kolei. Lub użyj bufora w pamięci i okresowo go przepłucz.
Myślę, że nadal trzeba zeskanować plik, aby dowiedzieć się, ile wierszy znajduje się w pliku w tym momencie. W takim przypadku możesz umieścić go w jakimś buforze, który możesz łatwo dodać i usunąć. Następnie wykonuje się rejestrowanie, a po zakończeniu można "ponownie zapisać" plik z buforem (lub tylko z ostatnich 1000 linii). Inne alternatywy są omówione powyżej. I tak, staraj się unikać usuwania linii po linii. Zasadniczo jest to kosztowna operacja.
Znalazłem kilka podobnych tematów tutaj i na CodeProject:
Flexible logger class using standard streams in C++
http://www.codeproject.com/Articles/584794/Simple-logger-for-Cplusplus
Mam nadzieję, że przydadzą :)
Gdy chcesz korzystać tylko jeden plik, a długość linii nie są stałe, nie ma sposobu, bez przepisywania cały plik.
W zależności od tego, jak często dodajesz plik, nie widzę problemu. 1000 linii ok. 100 znaków to tylko ok. 100kb, co nie jest dużo. Dodatkowo możesz dodać trochę histerezy.
Jednakże:
- Jeśli długość przewodu jest stała (lub trudno ograniczyć długość linii do pewnej stałej), można po prostu zastąpić najstarszą linię. Ale musisz śledzić pozycje plików dziennika starych/nowych linii
- Używałbym dwóch plików: Pierwszy, w którym dodajesz linie. Gdy plik się zapełni, zmień jego nazwę na drugą i wypełnij pierwszą od początku.
- 1. analizowania wielu linii ustalonym formacie pliku tekstowego
- 2. Linux: wysyłanie wyników DD do pliku tekstowego
- 3. Wypełnij NA w szeregu czasowym tylko do ograniczonej liczby
- 4. Java: Odczytywanie nowej linii z pliku tekstowego
- 5. Usunięcie konkretnej linii z pliku tekstowego?
- 6. java piśmie do pliku tekstowego
- 7. Kadaně Algorytm Liczby ujemne
- 8. C# - Wiązanie pola tekstowego do liczby całkowitej
- 9. Najszybszy sposób zapisu do pliku?
- 10. Jak odczytu i zapisu do/z pliku tekstowego z wartościami rozdzielonymi przecinkami
- 11. Metoda klasy linii zapisu BufferedWriter
- 12. R: lista Drukuj do pliku tekstowego
- 13. PowerShell: zapisywanie do pliku tekstowego
- 14. Odczytywanie pliku tekstowego do tablicy
- 15. Czy możemy użyć liczby jako węzła tekstowego w pliku XML?
- 16. AS3/AIR - Tworzenie pliku tekstowego?
- 17. Konwersja pliku PDF do pliku tekstowego
- 18. AtomicInteger do generowania ograniczonej sekwencji
- 19. narzędzie do generowania diagramu przepływu z zapisu tekstowego
- 20. Dostęp Muti do tego samego pliku tekstowego
- 21. C#: ogon jak program do pliku tekstowego
- 22. Łączenie linii z pliku tekstowego w systemie Unix?
- 23. Algorytm dla linii łączących prostokąty
- 24. zapisu array komórką połączeniu ciągiem liczbowym i wejście do pliku tekstowego
- 25. Objective C - Tworzenie pliku tekstowego do zapisu i odczytu wiersz po wierszu w kakao
- 26. Jaki jest najszybszy sposób zapisu matrycy do pliku tekstowego w Octave?
- 27. Jak usunąć znaki nowej linii z pliku tekstowego?
- 28. Wyjątek FileNotFound podczas próby zapisu do pliku
- 29. Python zapisu do pliku zwraca pusty plik
- 30. Zmiana uprawnień do odczytu/zapisu deskryptora pliku
Licznik i operator MOD? – Pol0nium
Czy w rzeczywistości konieczne jest opróżnienie każdej linii lub czy można zapisać do bufora tymczasowego? – jrok
Można przekształcić plik w okrągły bufor, o ile przydzielony zostanie stały rozmiar dla każdej linii. Ustaw pierwszą linię jako bieżący indeks zapisu, a następnie ustaw pozostałe linie na określoną szerokość. Kiedy osiągniesz pożądane maksimum, po prostu wróć do indeksu 0. –