Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2019 September 26

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Никто не запрещает удалять из исходного массива чанк, который отрезается в новый массив.
источник

SV

Sergey Vydayko in NodeUA - JavaScript and Node.js in Ukraine
Alexander
Никто не запрещает удалять из исходного массива чанк, который отрезается в новый массив.
+
источник

TT

Tommy's Theme in NodeUA - JavaScript and Node.js in Ukraine
Alexander
Никто не запрещает удалять из исходного массива чанк, который отрезается в новый массив.
а из памяти он тоже исчезнет? не будет ли слишком дорого перелопатить исходный массив?
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Tommy's Theme
а из памяти он тоже исчезнет? не будет ли слишком дорого перелопатить исходный массив?
ну как гарбадж коллектор его скушает, то исчезнет


Да и даже если делать копии, то память вырастен максимум на вес одного чанка. Вам же не надо хранить все чанки.
Взял кусок, отправил, взял новый, старый ушел в небытие.
источник

TS

Timur Shemsedinov in NodeUA - JavaScript and Node.js in Ukraine
Tommy's Theme
спасибо, но кажется это главным образом представляет академический интерес. Вот, к примеру, практическая задача. имеется очень большой массив объектов с данными и нужно эти данные залить в облачную БД. При этом данные лежат не в файле, а в памяти и у какого-нибудь google functions (GСP) количество мегабайт оперативки на вес золота. А облачная БД имеет лимит на размер пакета (количество объектов) который она может принять за один пост запрос и никаких потоков нет. Следовательно наш БОЛЬШОЙ массив данных надо порубить на кусочки и заливать в БД порциями при этом желательно не выносить эти кусочки в копии, чтобы не занимать память
Копию вы все равно сделаете при сериализации, потому, что по сети ходят строки, точнее буферы. Так что, порциями ериализируйте или типизированные массивы можно попробовать, потому, что там можно просто бинарные буферы из них брать.
источник

TT

Tommy's Theme in NodeUA - JavaScript and Node.js in Ukraine
Timur Shemsedinov
Копию вы все равно сделаете при сериализации, потому, что по сети ходят строки, точнее буферы. Так что, порциями ериализируйте или типизированные массивы можно попробовать, потому, что там можно просто бинарные буферы из них брать.
а вот предложение с удалением обработанного чанка из исходного массива на ваш взляд тяжелая операция?
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Ну лично я бы не удалял, т.к. вполне возможно, что до того, как проснеться гарбедж коллектор вы сможете отправить несколько чанков. И в итоге в памяти будет храниться несколько старых версий массива.
Да и вообще в некоторых кругах идея мутирования входных данных не приветствуется.
источник

TT

Tommy's Theme in NodeUA - JavaScript and Node.js in Ukraine
Alexander
Ну лично я бы не удалял, т.к. вполне возможно, что до того, как проснеться гарбедж коллектор вы сможете отправить несколько чанков. И в итоге в памяти будет храниться несколько старых версий массива.
Да и вообще в некоторых кругах идея мутирования входных данных не приветствуется.
мне тоже кажется, что трогать исходный массив плохая практика. думаю, что если не погружаться в дебри типизированных массивов, то вариант с надеждой на оперативную работу гарбаж коллектора наиболее оптимальный
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Если делать небольшие чанки и быстро их отправлять, то они будут попадать в "быстрый" грабадж коллектор (scavenge).
источник

TT

Tommy's Theme in NodeUA - JavaScript and Node.js in Ukraine
Alexander
Если делать небольшие чанки и быстро их отправлять, то они будут попадать в "быстрый" грабадж коллектор (scavenge).
есть какие-то конкретные условия на шанс попадать в scavenge?
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Тут нужно чуточку удачи и точный расчет.

scavenge срабатывает либо по времени, либо, когда заполняется new space в heap-е. Он может быть разный по размеру в зависимости от версии ноды, но, кажись, его можно задавать параметром. Он бывает 8мб, 16Мб

Так вот фишка в том, чтобы отрезаный чанк (вместе с остальными переменными) вмещался в этот "спейс".

И тогда, если этот чанк создастся и отправится (т.е. на него не будет ссылок) между двумя проходами scavenge, то он удалится из памяти, а не попадет в old space, с которым уже работает другой garbadge collector, который запускается значительно реже.

Я с этим на столько глубоко не экспериментировал, но вы можете попробовать.
Для ноды флаг --trace-gc вам очень пригодится в этом случае
источник

TT

Tommy's Theme in NodeUA - JavaScript and Node.js in Ukraine
Alexander
Тут нужно чуточку удачи и точный расчет.

scavenge срабатывает либо по времени, либо, когда заполняется new space в heap-е. Он может быть разный по размеру в зависимости от версии ноды, но, кажись, его можно задавать параметром. Он бывает 8мб, 16Мб

Так вот фишка в том, чтобы отрезаный чанк (вместе с остальными переменными) вмещался в этот "спейс".

И тогда, если этот чанк создастся и отправится (т.е. на него не будет ссылок) между двумя проходами scavenge, то он удалится из памяти, а не попадет в old space, с которым уже работает другой garbadge collector, который запускается значительно реже.

Я с этим на столько глубоко не экспериментировал, но вы можете попробовать.
Для ноды флаг --trace-gc вам очень пригодится в этом случае
спасибо! как поиграюсь. сообщу сюда результаты
источник

D

Dima Moroz in NodeUA - JavaScript and Node.js in Ukraine
кто скажет как правильно proxy настроить?  а то всегда ошибку корсе получаю
источник

G

GNU/Vsevolod in NodeUA - JavaScript and Node.js in Ukraine
Dima Moroz
кто скажет как правильно proxy настроить?  а то всегда ошибку корсе получаю
Дописывать заголовки access-control-allow-...
источник

AI

Anton Iskryzhytskyi in NodeUA - JavaScript and Node.js in Ukraine
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
Всем привет, на продакшене произошла такая вот штука
"message": "errorrequest to http://admin-settings-api.tamam.prod:5000/v1/settings failed, reason: getaddrinfo EMFILE admin-settings-api.tamam.prod admin-settings-api.tamam.prod:5000",
   "type": "system",
   "errno": "EMFILE",
   "code": "EMFILE",
   "level": "error",
   "stack": "FetchError: request to http://admin-settings-api.tamam.prod:5000/v1/settings failed, reason: getaddrinfo EMFILE admin-settings-api.tamam.prod admin-settings-api.tamam.prod:5000\n    at clientRequest.<anonymous> (/app/node_modules/node-fetch/lib/index.js:1455:11)\n    at clientRequest.emit (events.js:197:13)\n    at clientRequest.EventEmitter.emit (domain.js:446:20)\n    at clientRequest.emit (/app/node_modules/@sentry/node/dist/integrations/http.js:137:25)\n    at Socket.socketErrorListener (_http_client.js:397:9)\n    at Socket.emit (events.js:197:13)\n    at Socket.EventEmitter.emit (domain.js:446:20)\n    at emitErrorNT (internal/streams/destroy.js:82:8)\n    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)\n    at processTicksAndRejections (internal/process/next_tick.js:76:17)"
}

Как я понимаю, fs.open открывает новые процессы которые ссылаются на открые файлы и не успевает закрыть  эти процессы и в какой-то момент этих открытых дескрипторов становится больше лимита и сервак ложится. Скорее всего проблема в winstone, кто сталкивался и что посоветуете?
источник

AI

Anton Iskryzhytskyi in NodeUA - JavaScript and Node.js in Ukraine
источник

D

Dima Moroz in NodeUA - JavaScript and Node.js in Ukraine
понял
источник

IT

Ivan Timoshenko in NodeUA - JavaScript and Node.js in Ukraine
можешь собираться
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Sergey Vats
Всем привет, на продакшене произошла такая вот штука
"message": "errorrequest to http://admin-settings-api.tamam.prod:5000/v1/settings failed, reason: getaddrinfo EMFILE admin-settings-api.tamam.prod admin-settings-api.tamam.prod:5000",
   "type": "system",
   "errno": "EMFILE",
   "code": "EMFILE",
   "level": "error",
   "stack": "FetchError: request to http://admin-settings-api.tamam.prod:5000/v1/settings failed, reason: getaddrinfo EMFILE admin-settings-api.tamam.prod admin-settings-api.tamam.prod:5000\n    at clientRequest.<anonymous> (/app/node_modules/node-fetch/lib/index.js:1455:11)\n    at clientRequest.emit (events.js:197:13)\n    at clientRequest.EventEmitter.emit (domain.js:446:20)\n    at clientRequest.emit (/app/node_modules/@sentry/node/dist/integrations/http.js:137:25)\n    at Socket.socketErrorListener (_http_client.js:397:9)\n    at Socket.emit (events.js:197:13)\n    at Socket.EventEmitter.emit (domain.js:446:20)\n    at emitErrorNT (internal/streams/destroy.js:82:8)\n    at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)\n    at processTicksAndRejections (internal/process/next_tick.js:76:17)"
}

Как я понимаю, fs.open открывает новые процессы которые ссылаются на открые файлы и не успевает закрыть  эти процессы и в какой-то момент этих открытых дескрипторов становится больше лимита и сервак ложится. Скорее всего проблема в winstone, кто сталкивался и что посоветуете?
Тут может быть дело не только в fs.open. Так же это может значить слишком много открытых сокетов.
Это может быть как винстон, так и прочая бесполезная хрень типа @sentry/node
источник