GG
https://gist.github.com/SergProduction/84ecf93b85c0857f29429d98a355a2c9
GG
Json там очень большой, я его кусками из файла читаю, на него можно не обращать внимания
Kanat
почему var в начале кода?
Kanat
потом es6 дальше
GG
Проверь. Не в этом проблема)
Alexander
let dirArr = fs.readdirSync( path.join(__dirname, 'base/jpg/') )
Alexander
мб тут?
Alexander
если там 5к жпегов
GG
Ааа
GG
Может
GG
Но думаю нет
Alexander
хотя... он же файлнеймы читает
Alexander
вообще --inspector творит просто магию
GG
Сто файлов он обрабатывает меньше чем за минуту
GG
3к файлов, я запустил 10 мин назад, только 300 обработал
Alexander
глянь в htop
Alexander
мб память скушалась
GG
Не скушалась, вроде же нода не может задействовать всю память. Точно не знаю, поэтому и спрашиваю
Alexander
baseArray.forEach( (row, i, arr) => { fileName.forEach( (file, z) => {
GG
Может быть, есть способы задействовать всю оперативу
GG
?
Alexander
вставь на вызове equalBase вывод длины baseArray
GG
baseArray.forEach( (row, i, arr) => { fileName.forEach( (file, z) => {
Ааа, да - кажется здесь. baseArray.length = 220k fileName.length = 3k
Alexander
там цикл в цикле
GG
И Того 220к * 3к
Alexander
а задача-то вообще какая?
GG
там цикл в цикле
Естественно, а и иначе как сравнить имя файла с записями в бд(baseArray)
Alexander
чето тут не бд, а json
GG
Ага
Alexander
https://www.npmjs.com/package/lowdb
Alexander
если там 220*3 кк, то чтение json целиком и парсинг могут оказаться значительно быстрее, чем гоняние массивов
Alexander
хотя... без индексов anyway тормоза будут это же seqScan
GG
Там json на 40мб я сперва пробывал его целиком прочесть, нода выкинула ошибку о том что память закончилась, теперь я читаю кусками через потоки
Alexander
readJsonСhunk -> insert manipulating delete * from table
Alexander
перебор на 220 строк это ужс что
GG
Может быть есть способы задействовать всю оперативу?
Kanat
Не сдавайся, ответ совсем рядом.
Alexander
оператива не даст тебе нормальный поиск)
Alexander
/stat@combot
Combot
combot.org/chat/-1001041204341
GG
С поиском все нормально, 100 картинок копируются меньше чем за минуту с той же базой.
GG
оператива не даст тебе нормальный поиск)
Еще не пробовал на практике, нужно почитать, попробовать, распределять нагрузку на все ядра. Может быть это поможет
Alexander
эм
Alexander
ну лан)
Alexander
или брать дерево
Alexander
но деревьев будет несколько судя по количеству сравнений
GG
Ммм
Alexander
row[5] == file.date && row[4] == file.show && row[3].match(/\d+/)[0] == file.id субд такое сделает за мгновение + если ты ищешь конкретно по row[3].match - стоит положить это доп. элементом в массив?
Sergey
С поиском все нормально, 100 картинок копируются меньше чем за минуту с той же базой.
хороший тебе вариант предложили прочитай файл кусками и запхай во временную базу с индексами затем оперируй уже тем что есть в базе после нужных операций, просто пройдись по файликам и переименовывай или что там а потом снеси записи
GG
Да, придется
Sergey
я когда писал утилитку в электрон так и делал
GG
Не хотелось задействовать бд, но вижу что здесь она необходима
Alexander
можно и деревьями, но надо в деревья уметь:)
Sergey
а какая разница, если данные в памяти не помещаются?
Alexander
там 220к строк поиск идет по date, show (не знаю че там, мб буль?) и fileid все три легко кастятся в int три дерева на 220к листьев влезут в ram
Alexander
хотя тут не совсем дерево-то ну короче алгоритмы и структуры затащщат если надо,
Sergey
а вообще ты мог выкидывать копирование в отдельные процессы. было бы в разы быстрее
Yan
ребят, еще вопросик
Yan
по ресту модифаить отдельные доки лучше через пут или патч?
Yan
я почитал, используются оба, но вот бест практис не увидел, в каких случаях какой запрос выбирать
Sergey
по ресту модифаить отдельные доки лучше через пут или патч?
PUT - полное обновления ресурса, то есть ты должен кинуть весь ресурс целиком PATCH - частичное, ты можешь кидать только то, что нужно обновить
Alexander
Sergey а сколько там ram? я сейчас json на 180Мб на 400к+ строк распарсил за 7 секунд на 1 гб оперативы
Alexander
зохавало 700-800 Мб примерно
Alexander
даже меньше
Alexander
632Мб
Alexander
да, там уже гига вряд ли будет лишнего
Alexander
тогда точно через субд - они умеют хорошо работать в условиях "не влазит в ram"
GG
Дело в том, что я открываю диспечер задач, и вижу что нода даже половины оперативны не использует
Alexander
а сколько доступной?
GG
Прости, не могу посмотреть, комп рабочий, я уже приехал домой
GG
Примерно 500 мб доступной оставалось
GG
С учётом того что win7 в среднем 1гб на свое существование берет
Alexander
может и не хватить
Alexander
попробуй в коде вставить console.log(`node has taken ${process.memoryUsage().rss/1024/1024} mb`)
GG
Sergey а сколько там ram? я сейчас json на 180Мб на 400к+ строк распарсил за 7 секунд на 1 гб оперативы
Именно сам парсинг 220к и внутри цикл на 100, я пробовал - расспросил за 2сек. А если при этом копировать файлы 100 штук, то примерно сек 40
GG
Но как только запускаю копирование на 3к файлов, копирование происходит примерно со скоростью 3 файла в минуту
Yeti
А ты попробовал просто 3000 файлов переложить ?