Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Przetwarzanie dużych ilości tekstu
jamaleq
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 20.02.2015

Ostrzeżenie: (0%)
-----


Cześć.

Napisałem skrypt, który przyjmuje duże (nawet ogromne) ilości tekstu, na wejściu mam pliki po 256 MB (zmienna, którą można regulować, tu pokazane obrazowo).
Plik ładuję do zmienne przez
  1. serialize(file(plik)); (aktualnie, przy próbie pracy na stringach - wcześniej było bez serialize)
potem go przetwarzam. Muszę wyciągać po kilkaset słów, np. 500. Nie byłoby problemu, gdybym mógł te słowa przechowywać w tablicy, jednak przy takiej ilości danych tablice rozrastają się do nieakceptowalnych rozmiarów z punktu widzenia pamięci systemu. Po podzieleniu pliku na słowa, tablica 'zajmuje' ok. 8GB RAM przy dedyku z 32GB.

Rozwiązaniem jest korzystanie ze stringów, znalazłem pewne rozwiązanie, jednak nie chce działać tak, jak to założyłem.
Mianowicie:
  1. preg_replace( "/((?:\S*?\s){$this->_wordLimit})/", "$1", $this->_content);

Gdzie $_wordLimit to ograniczenie słów dla wyrażenia, a $_content to string z załadowaną zawartością pliku.

Rozwiązanie te prawie działa. Prawie, bo zamiast zwracać mi np. 500 pierwszych wyrazów, zwraca owego stringa bez tych wyrazów.

Próbowałem już różnych regex'ów, jednak nie udało mi się znaleźć odpowiedniego rozwiązania.

PS. Jeszcze raz zaznaczam, że operacje na tablicach odpadają.
PS2. Próbowałem też kombinować z zapisywaniem słów do bazy (SQLite3), jednak wydajność czasowa takiego rozwiązania jest tragiczna.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
jamaleq
post
Post #2





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 20.02.2015

Ostrzeżenie: (0%)
-----


@b4rt3kk,
spróbuję coś z tym zrobić.

Edit: tym sposobem pobieram pierwszy wynik z $matches, potem wrzucam go do tabeli, następnie usuwam z pierwotnego stringa za pomocą substr.
Póki co, przy 8 równoległych procesach przy plikach po 256MB zużycie pamięci nie przekracza 25%.

Edit2: jednak te rozwiązanie, podobnie jak te z bazą, znacznie wydłuża czas wczytywania pliku...

@Crozin,
1) bez formatu, plain text; generalnie, plik wejściowy ma 8+ GB, kroję go na pliki o wcześniej zdefiniowanym rozmiarze (np. 256MB) za pomocą exec(cut ~), wczytuję pokrojony plik jak w pierwszym poście, itd.
2) muszę z takiego 256MB pliku wrzucić to gdzieś, a następnie pokroić na wyrazy, po x wystąpień, a następnie te x wyrazów wrzucić do XML'a.
3) korzystam z pthreads (nawet działa), ale jeden plik = 1 proces, więc małe paczki raczej odpadają.

Jak już pisałem wcześniej, wrzucenie pojedynczych wyrazów to tablicy kończy się tym, że 1 x256MB plik zajmuje 1/4 całości RAM.

Ten post edytował jamaleq 20.02.2015, 14:01:25
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 06:05