Търсачка във файлове

dakata__92

Super Moderator
Здравейте,
Преди време разписах една опростена търсачка във файлове. Файловете са много и няма възможност да се прехвърлят в база данни.
Как мога да ускоря търсенето в тях? Говоря за около 200 000 файла с по над 300 000 записа.
Код:
<?php
$filePath = 'test.txt';
$string = '';
$returnArray = [];
$file = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($file as $k => $row) {
	if (stripos($row, $string) !== false) {
		$returnArray[$k] = $row;
	}
}
Впрочем това е най-базистният вариант на търсачката. Идеята е да ми връща всички съвпадащи със стринга резултати. Чудех се за някакво подобрение със shell или нещо от сорта, но реших първо да се консултирам с вас.
 
findstr /I DUMA *

Символа * означава всички файлове в директорията.

Ако искаш в конкретна папка и конкретно разширение на файл ползвай

findstr /I ДУМА E:\direcotory\*.txt
 
Ticketa каза:
findstr /I DUMA *

Символа * означава всички файлове в директорията.

Ако искаш в конкретна папка и конкретно разширение на файл ползвай

findstr /I ДУМА E:\direcotory\*.txt

findstr /I Тест d:\xampp\htdocs\src\bin\*.txt

Тествам в момента на локална машина.
shell_exec(); ми връща NULL, а през конзолата ми казва
FINDSTR: Cannot open ?:'??'
FINDSTR: Cannot open ?<??'
 
findstr /I Тест d:\xampp\htdocs\src\bin\*.txt 2>nul

Опитай така

https://stackoverflow.com/questions/30813972/what-does-nul-21-mean-in-a-batch-statment/30814001#30814001
 
Възможно е да греша флага /I , довечера като седна пред лаптопа ще погледна и ще пиша отново

Ако имаш възможност и не е конфиденциалност хвърли 2-4 реда от текста за да направя тест и ще пиша
 
Ticketa каза:
Възможно е да греша флага /I , довечера като седна пред лаптопа ще погледна и ще пиша отново

Ако имаш възможност и не е конфиденциалност хвърли 2-4 реда от текста за да направя тест и ще пиша

Пробвай до тогава и замени флага /I с флага /F
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/findstr
Всякакви варианти тествах.
findstr /s /i Тест d:\xampp\htdocs\src\bin\*.txt
 
Ако ти трябва за теб само, си включи WSL с едно Убунту и рънни линукската команда.


Иначе с PHP, най-вероятно трябва да си спретнеш нещо с pthreads или Process Control, за да ускориш процеса.

Ако не това, то аз бих разделял работата, подобно на Binary Search, но не точно. Понеже са много файлове, пускаш отпред и отзад да почнат да се ровят файловете. Ако не зареждаш целия файл в паметта, то тогава ще го четеш линейно (което е по-бавно). Ако не ти пречи да ги зареждаш в паметта, то ще можеш отново да ги четеш отпред и отзад, като естествено, трябва да ползваш един флаг, който да каже на всички, че си намерил каквото търсиш и да спре всички цикли и да изчисти паметта.

Ако успееш да го подкараш паралелно, ще е най-добре.
 
Revelation каза:
Ако ти трябва за теб само, си включи WSL с едно Убунту и рънни линукската команда.


Иначе с PHP, най-вероятно трябва да си спретнеш нещо с pthreads или Process Control, за да ускориш процеса.

Ако не това, то аз бих разделял работата, подобно на Binary Search, но не точно. Понеже са много файлове, пускаш отпред и отзад да почнат да се ровят файловете. Ако не зареждаш целия файл в паметта, то тогава ще го четеш линейно (което е по-бавно). Ако не ти пречи да ги зареждаш в паметта, то ще можеш отново да ги четеш отпред и отзад, като естествено, трябва да ползваш един флаг, който да каже на всички, че си намерил каквото търсиш и да спре всички цикли и да изчисти паметта.

Ако успееш да го подкараш паралелно, ще е най-добре.

То лошото, като цяло е, че идеята на тази търсачка не бе това за което я използват в момента. Добра идея е да пусна няколко нишки да търсят. Все още не мога да подкарам и shell-а на колегата с findstr. Мисля, че с него ще ускоря търсенето и ще намаля писането, без да си играя да вдигам паралелни процеси.
 
Както казах преди това , пусни няколко реда (може и да не са същите просто примерна структура на съдържанието)

Числа, скоби, текст, кирилица, латиница, символи. Смятам, че е важно за да направя тест и да споделя различно мнение

Поздрави
 
Ticketa каза:
Както казах преди това , пусни няколко реда (може и да не са същите просто примерна структура на съдържанието)

Числа, скоби, текст, кирилица, латиница, символи. Смятам, че е важно за да направя тест и да споделя различно мнение

Поздрави
Прощавай, бях забравил, че искаше примери.
Файловете съдържат кирилица. Текста е само с главни букви и са на нов ред:

ТЕКСТОВ РЕД - ЕДНО
РЕД ДВЕ ОТ ФАЙЛА
ТРЕТИ РЕД СЪС СИМВОЛИ
 
Колеги, все още ми е актуална тази тема. За момента няма да правя допълнителни нишки. Със shell-а продължавам да се боря!
 
С латински букви няма проблеми, проблема е с кирилицата - не изкарва никакви резултати.

D:\>cd kuku

D:\kuku>findstr /s /i Тест D:\kuku\*.txt

D:\kuku>findstr /s /i BUHEM D:\kuku\*.txt
D:\kuku\kuku.txt:BUHEM

D:\kuku>findstr /s /i BUHEM D:\kuku\*.txt
D:\kuku\kuku.txt:BUHEM


D:\kuku>findstr /s /i BUHEM D:\kuku\*.txt
D:\kuku\kuku.txt:BUHEM


D:\kuku>findstr /s /i бухем D:\kuku\*.txt

D:\kuku>findstr /s /i БУХЕМ D:\kuku\*.txt

D:\kuku>findstr /s /i АБВГ D:\kuku\*.txt

D:\kuku>findstr /s /i АБВГ D:\kuku\*.txt

D:\kuku>findstr /s /i АБВГ D:\kuku\*.txt

D:\kuku>

Направих ексиперимент с chcp 65001, който се провали - директно cmd изчезна.

chcp 65001 е много опасен. Освен ако програма не е специално създадена да заобикаля дефектите в API на Windows (или използва библиотека за изпълнение на C, която има тези решения), тя няма да работи надеждно. Win8 отстранява 1/2 от тези проблеми с cp65001, но останалото все още е приложимо за Win10.

Основно проблема си е от самият шел. Ще търся алтернатива и пак ще пиша, освен ако не си открил решение.

ЕДИТ: Пробвах и chcp 1252 (CP1252) , обаче е резултата е негативен.

Код:
D:\kuku>chcp 1252
Active code page: 1252

D:\kuku>findstr /s /i АБВГ D:\kuku\*.txt

D:\kuku>findstr /s /i АБВГ D:\kuku\*.txt

D:\kuku>


Не съм сигурен , но ако ползваш терминала https://sourceforge.net/projects/mingw-w64/ , може да има по-добър резултат, тъй като имаш следната опция:
G51mw.png




Дори великият PowerShell ударих на греда с него.
PS D:\> [console]::InputEncoding


IsSingleByte : True
BodyName : cp866
EncodingName : Cyrillic (DOS)
HeaderName : cp866
WebName : cp866
WindowsCodePage : 1251
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 866



PS D:\> [console]::eek:utputencoding


IsSingleByte : True
BodyName : cp866
EncodingName : Cyrillic (DOS)
HeaderName : cp866
WebName : cp866
WindowsCodePage : 1251
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 866



PS D:\>

code-page-all.jpg
 
Все още издирвам вариант да търся по-бързо. Няма да вдигам нишките на търсене.
 

Горе