Nie mogę wprowadzić długiego RegEx


(Djzon) #1

Nie mogę wprowadzić długiego RegEx.

^(nazwa pliku1|nazwa pliku 83000)$

 

Zajmuje 83.000 znaków....

 

Jaki edytor 64-bit  wspiera długie regex-y?

 

 

Chcę znależć 5000 nazw w pliku tekstowym i wyeksportować do pliku tekstowym.

 

Nie jest to ciągły tekst, tylko ścieżki do plików...

 

Każdy albo się zawiesza, dużo CPU, RAM.... lub działa ... ale "UCINA" zbyt długi regex

 

 

Jakieś inne lepsze pomysły ?? Obejście problemu?

 

Lepiej znależć wszystko, niż dodawać po kawałeczku i marnować swój czas...


(enedil) #2

Użyj mocy!

Użyj UNIX!


(Kużdo) #3

W tym pliku każda linijka to jedna nazwa pliku?

Regex ma zawierać 5000 nazw, które łącznie dają 83k znaków? Czyli średnio mamy 16,6 znaku na nazwę?

Ja bym to oparł o PHP, bo tak byłoby mi najszybciej :smiley: Robisz tablię z tymi wszystkimi nazwami, potem czytasz linia po linii z pliku i sprawdzisz in_array czy jest element, jak jest, to go zapisujesz do innego tablicy albo drukujesz na ekran, co tam byś chciał.

 

No i co ważne, tablię z 5000 nazwami łatwo zbudować, o ile masz je w każdej linijce osobno, zamiana tekstu z wykorzystaniem regexa, szukasz: ^ i zamieniasz na " potem szukasz $ i zamieniasz na ", i masz wszystkie elementy tablicy. Później możesz usunąć entery i to też za pomocą regexa lub prostszego \r\n


(Drobok) #4

Iteruj po kolei, na co komu takie wyrażenie regularne.


(Djzon) #5

Lepsze rozwiązanie to bez Regex tak jak mówi drobok ^^

 

Użyłem po prostu

 

*filename1* *filename2* *filename5000*

 

-Użyłem Core Tuner - zredukowałem użycie procesora z 99% do max 75% CPU (3 RDZENIE) aby komputer “odetchnął”… i przestał być powolny jak ślimak…

-Szukam… jeszcze nie zakończył się postęp… Czekam na koniec działania…

 

 

Edit:

Powodzenie… Zakończone. Mam wyniki, teraz tylko zapisać do pliku tekstowego… :slight_smile:


(Drobok) #6

Powinieneś to zrobić inaczej, po pierwsze skoro szukasz nazw w ścieżkach to nie używaj wyrażeń regularnych - są strasznie wolne.

Użyj czegoś w stylu https://msdn.microsoft.com/en-us/library/ms228630.aspx

Stwórz kilka readerów i szukaj kilku nazw w tym pliku na raz w osobnych wątkach


(Djzon) #7

drobok - wyrażenia regularne są OK, pod warunkiem, że są “optymalizowanie”. Z tymi gwiazdkami to jest w porządku, sam mi zaproponował autor pewnego programu :wink:

Robiłem mnóstwo testów…

Próbowałem kilku regex były dobre, ale nie były zbyt optymalne na 60-90 tysięcy “String”(ciągów) co powodowało duże użycie pamięci RAM - powyżej 10GB…teraz nie wzrasta…

 

Jężyk C# ?

 

Akurat program napisany prawdopodobnie w .NET

 

Oprogramowanie bardzo szybkie - znajdzie każdy plik w ciągu kilku sekund nawet na 36 TB danych i kilkadziesiąt milionów plików :slight_smile: więc się przydaje to szukania plików, zapisywania ścieżek,

Jest szybszy w szukaniu plików może  z tysiąc razy od Windows Search, Total Commander  i inne :slight_smile:

Cóż, autor trochę zdziwione, że szukam tylu nazw i nawet nie wziął tego wcześniej pod uwagę… ale ja testuję …on ulepsza :slight_smile:


(mikolaj_s) #8

A jak dlugo pisałeś to wyrażenie regularne o 83000-cach znaków? :wink:


(Djzon) #9

 

Regex jest konstrukcją nazw, które szukam, więc to zajmuje chwilę…

 

np. pies.*|kot.* - czyli wszystkie nazwy zawierające fragment ‘pies’ lub ‘kot’

 

 

albo "optymalizowany regex dla powórzeń PODOBNYCH wyrazów

^-92614618_3(65118849|58306991|57676030).*

 

Gdzie początkowa liczba to:

-92614618_3…


(kostek135) #10

Regex a(b|c|d) nie różni się w czasie wykonania niczym od ab|ac|ad, więc nie wiem gdzie ta optymalizacja. Oba są sprowadzone do takiego samego automatu skończonego.

Problemem dużego użycia pamięci nie są dane wejściowe tylko wykorzystanie regexów do czegoś, do czego się one nie nadają. Dla twojego ostatniego regexa zostanie wyprodukowanych 36 stanów. Jeśli w twoim regexie dominuje konkatenacja i jest on długi to zawsze będzie słabo działać.


(Djzon) #11
  1. Pokaż mi oprogramowanie np. Edytor tekstu do którego można wprowadzić Regex np. string o długości 90000 :wink: … a nawet jeśli tak to czy uda Ci się parsować…

a)mój przyjaciel zwiększył limit string-u w swoim oprogramowaniu(pisanym w języku .NET) jaki można wprowadzić… więc działa… wprowadził kilka poprawek, ulepszen itd.

  1. Jak już wspomniałem w #5 poście ZREZYGNOWAŁEM z ReGex - zastąpiłem je tylko zwykłymi gwiazdkami , które odseparowują poszukiwane nazwy… więc wykorzystanie pamięci jest niskie - do kilku GB

  2. Ja wprowadzając tekst o długości powiedzmy 90000 znaków - wykorzystanie procesora jest najwyższe, ale można je zredukować do pojedynczych rdzeni… im więcej mocy - tym szybciej zadanie zostanie wykonane…

 

Tu masz rację… To już słyszałem od fachowca od oprogramowania i programowania w Java.

 

Chciałem przefiltrować nazwy, wprowadzając Regex, który był zły pod względem wydajnościowym dla tego oprogramowania… więc polecił mi zoptymalizować Regex, im krotszy tym lepiej :wink: Tak myślę :slight_smile:

Jeśli znasz “The Best” RegEx - to napisz, który wg Ciebie ten najlepszy wydajnościowo :slight_smile: