Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Podział dużego pliku tekstowego

Ostatnio zmodyfikowano 2015-05-10 18:17
Autor Wiadomość
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".

P-132014
pekfos
» 2015-05-10 14:45:08
Po co dzielić?
P-132016
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ż.
P-132017
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.
P-132018
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.
P-132020
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.
P-132024
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.
P-132026
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ę.
P-132030
« 1 » 2
  Strona 1 z 2 Następna strona