wiktor12348 Temat założony przez niniejszego użytkownika |
Podział dużego pliku tekstowego » 2015-05-10 14:42:15 Witajcie
Mam za zadanie przeszukać duży plik tekstowy (ponad 200mb). Muszę go jakoś podzielić na części. Pytanie jak? Każda "dana" jest w osobnej linijce. Nie mogę przelecieć po linijce bo to bez sensu. Mogę sprawdzić sobie "wielkość" pliku przez stat.st_size, ale jak go podzielić tak że "podział" nastąpi a takim miejscu gdzie kończy się wybrane hasło. Chodzi o to by nie "ucinał" danego ciągu, tylko dzielił po złamaniu linii.
Jakieś propozycje? Używam gcc. Czytałem coś o blokach dyskowych, ale nie wiem jak to połączyć.
Myślałem by podzielić "na ślepo" i sprawdzić czy dany bit jest znakiem końca linii, jak nie, to przesuwać tak długo aż znajdzie "\0".
|
|
pekfos |
» 2015-05-10 14:45:08 Po co dzielić? |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2015-05-10 14:48:36 Podobno szybciej zakończy działanie program - mam to przetestować i zdać relacje.
Plik waży ponad 200mb i ma 150tys linii. Jak nie więcej.
Chce go podzielić na cześć i przesłać do wątku, by tam był przetwarzany.
Nie ja wybrałem metodę, tak ma być i już. |
|
pekfos |
» 2015-05-10 14:52:33 Wejdź w środek pliku i doczytaj do końca linii. Jednym wątkiem będziesz czytać od początku, do tej pozycji, a drugim od tej pozycji do końca. |
|
Fireho |
» 2015-05-10 14:53:23 Robisz wspólny uchwyt do pliku i wywołujesz na nim getline . Po użyciu getline pozycja w pliku zostanie przesunięta na kolejną linijkę, a zastosuje się to do wszystkich wątków - musisz tylko zrobić zabezpieczenie przed jednoczesnym odczytem(np. zrobienie strumienia jako std::atomic < std::ifstream > ). PS: Takie rzeczy powinieneś wymyślać sam. |
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2015-05-10 15:29:56 @pekfos: Mam użyć N wątków.
@Fireho: Mam używać jedynie C. Wiem jak działa getline tylko nie wiem jak podzielić to, by wszystkie wątki "jednocześnie" pracowały. Przykład: wątek 1: dane od linijki 1 do 10000 wątek 2: dane od linijki 10000 do 20000 I tak dalej...
Mam problem z podziałem. Bo niby skąd wiem że dany plik ma XXX lini, muszę je liczyć - czyli przejść przez wszystkie linie - zajmuje to czas. Mogę jedynie wyciągnąć ilość znaków - rozmiar, tak mi się zdaje. Mam rozmiar i co? Dziele przez ilość wątków to "utnie" mi dane z linijki gdzieś w środku.
Chyba ze coś źle pojmuje. |
|
pekfos |
» 2015-05-10 15:34:11 @pekfos: Mam użyć N wątków.
|
To dziel analogicznie na N wątków. czyli przejść przez wszystkie linie - zajmuje to czas. |
Drugie tyle, co faktyczne przetwarzanie tego pliku. Nie podzielisz tego w sposób zrównoważony. Mam rozmiar i co? Dziele przez ilość wątków to "utnie" mi dane z linijki gdzieś w środku. |
Wejdź w środek pliku i doczytaj do końca linii. |
|
|
wiktor12348 Temat założony przez niniejszego użytkownika |
» 2015-05-10 15:43:23 Drugie tyle, co faktyczne przetwarzanie tego pliku. Nie podzielisz tego w sposób zrównoważony. |
Nie mam zamiaru. Zresztą linie mają od 10 do 300 znaków. Wejdź w środek pliku i doczytaj do końca linii. |
Najprawdopodobniej masz racje, ale mój mały mózg nie może pojąć co mi to da tak naprawdę. |
|
« 1 » 2 |