BG Development


  Reply to this topicStart new topicStart Poll

> NodeJs ефективност при много на брой txt файлове, Търсене на txt файл по име измежду хиляд
bishkot
Публикувано на: 10-01-2022, 15:55
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 390
Регистриран на: 17.05.05



Здравейте!

Става въпрос за websocket.

Примерно
CODE

websocket.on('message', data => {
...
...

var filename=data.filename;

}







Имам директория да речем DATA.
Броят на файловете в тази директория се предполага да расте.... в момена има около 200-300 TXT файла.
От websocket-а на моменти се получават доста много на брой съобщения за единица време.
Т.е. "екстремно" натоварване - не винаги, но се случва. За всяко съобщение от websocket-a (примерно име на файл) трябва да да се търси измежду тези 200-300 файла а и те ще растат за напред.....

Например за секунда от websocket-a се получават 500 имена на файлове. Всяко едно име се търси измежду 200-300 файла от DATA директорията.

Пробвах да търся файал по тези два начина - струва ми се че разлика няма.... смучи процесора на 60% а и паметта на NodeJs хвърчи докато не вземе да крашва освен ако не го рестартирам.

Използвам
CODE

-max-memory-restart 1000M

за целта.

CODE
 function user_order_exist_OLD(filename)
{
      const files = recursive('./DATA');
      for(i=0;i<=order_files.length-1;i++)
            {
            var current_path=files[i];

            var pathparts=files[i].split(''+'\\');
            var found_filename=pathparts[5];
           if (found_filename==filename+'.TXT')
                  {
                  
                  existing_file_path=current_path;return (existing_file_path);
                  }
            
            } return '0';
}
 


и
CODE

function user_order_exist_NEW(filename)
{
      const files = recursive('./DATA');
      const found = files.filter(item => item.toLowerCase().indexOf(filename) > -1);

      if (found.length==1){var existing_file_path= found[0]; return (existing_file_path);}
      else {return '0';}
}



Би ли било по добре имената на файловете да се съхраняват във база данни от гледна точка на бързината и натоварването или как биха се оптимизирали нещата?

Ако все пак подхода не е грешен може би просто си трябва по мощна машина с повече RAM и добро CPU?

Иначе това си е нормално PC с i3 8 RAM i SSD под Win 10 64 Bit.

Благодаря
PMEmail Poster
Top
thrawn
Публикувано на: 10-01-2022, 16:04
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3239
Регистриран на: 17.01.17



Какво се опитваш да направиш?
Като цяло, при подобна постановка проблем ти е файловата система. Което значи, че или трябва да ползваш база данни или да структурираш директориите (година, месец, ден или нещо подобно, в зависимото от конкретната ситуация).
PMEmail Poster
Top
bishkot
Публикувано на: 10-01-2022, 16:19
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 390
Регистриран на: 17.05.05



Искам да реагирам максимално бързо при намерен файл. Т.е. когато определено съобщение от websocket-a отговаря на критерия....ще извършвам други операции....това най общо казано.

До сега съм се занимавал с php mysql. Mysql подходящ ли е за nodejs.
Четох че се препоръчва MongoDB.

Дефакто вмсето да се търси името на файла измежду хиляди файлове отново ще имаме много на брой заявки от рода на "Select * from table where filename=filename_from_WS"

Това ще подобри ли производителността/бързината ?

Това с файловете остана отпреди тъй като не предполагах че нещата ще нараснат....

Мерси за насоката!
PMEmail Poster
Top
Bender++
Публикувано на: 10-01-2022, 16:31
Quote Post



Име:
Група: Потребител
Ранг: Активен

Мнения: 193
Регистриран на: 18.04.21



пренапиши го на Rust, NodeJS e боклук


--------------------
Ваксините са лъжа и НЕ работят! Не на ковид фашизма!
PMEmail Poster
Top
enf
Публикувано на: 10-01-2022, 16:36
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 55
Регистриран на: 01.08.14



същественото нещо, което не казваш, е дали ти контролираш (или имаш достъп до събитието) добавянето/махането на файлове в тази директория.

Ако да- лесно. Още при старт на приложението си взимаш всички файлове в един списък и след това го актуализираш при промяна.

Ако нямаш контрол - тогава ще ти трябва нещо многоплатформено, аналог на ReadDirectoryChangesW. Може би в nodejs има реализиран такъв врапер.

Ако и това не е възможно, кофти. Ще трябва някакво творчество, както thrawn е предложил с преструктуриране на директории и т.н. Ама пак ще е бавно де.
PMEmail Poster
Top
thrawn
Публикувано на: 10-01-2022, 16:57
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3239
Регистриран на: 17.01.17



По скоро, select 1 from tbl where filename = filename_from_WS. На теб ти трябва само булева стойност true/false за това дали даден файл го има или не. И разбирасе, трябва да сложиш индекс на filename та да се оптимизира търсенето по него.

Между другото, може и да поставиш някакъв bloom филтър пред базата данни за да си спестиш излишни заявки.

Това мнение е било редактирано от thrawn на 10-01-2022, 17:02
PMEmail Poster
Top
bishkot
Публикувано на: 10-01-2022, 21:10
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 390
Регистриран на: 17.05.05



За сега "настъкмих" нещата като на всяка секунда-две чета директорията и съхранявам file paths в масив. Всяко съобщение от websocket-a проверява в този масив вместо да се чете директорията на всяко съобщение т.е. по 500 пътви в секунда и т.н.

За мен решението отново е временно но за момента е ок.

За напред се вижда да се ползва БД , някак си искам да е mysql с един XAMP - тъй като никога не съм се занимавал с mondoDB.

Благодаря за насоките guys!
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0