Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2020 January 28

ВС

Владимир Свешников... in NodeUA - JavaScript and Node.js in Ukraine
Ну.. если мыслить строго в рамках термина.. Далеко уехать будет трудно..
а где вы прочитали что этот термин имеет именно такой ровный смысл ?
Вот в СИКП это вроде "Упаковка данных в единый компонент"
источник

ВС

Владимир Свешников... in NodeUA - JavaScript and Node.js in Ukraine
Просто вот например..
Можно использовать блок кода чтобы образовать контекст, область видимости.
И что то там извращённое сделать, так чтобы этого не увидело "основное состояние"
Вот это я понимаю - сокрытие
А Инкапсуляция она посложнее будет.
Всё так же ИМХО :)
источник

1

1 in NodeUA - JavaScript and Node.js in Ukraine
Владимир Свешников
Когда я объясняю кому то сети, я начинаю с разговора об инкапсуляции вот так:

——

Предположим, мы отправляем письмо в другую страну по обычной почте.
   • Текст письма - полезные данные, которые мы хотим доставить.
   • Мы заворачиваем письмо в конверт, который подписываем по определенным правилам - это мы используем протокол нашей местной почты.
   • Почта в свою очередь, например, грузит письмо в контейнер и тоже как-то его подписывает для доставки на самолете в другую страну - это почта использует протокол международного почтового обмена.
   • Потом в стране назначения контейнер открывают,
   • Читают что написано на конверте, и понимают, в какой город письмо отправить
   • Получатель в итоге открывает конверт и достает письмо.
Во всей этой цепочке письмо ничего не знало про конверт, а конверт ничего не знал про контейнер, их просто заворачивали целиком, а потом доставали.

И никто не лез внутрь контейнера, чтобы посмотреть на текст письма.

Это все вместе называется “инкапсуляция”.
Протоколы разных уровней последовательно “завернуты” друг в друга, то есть данные, которые доставляет протокол 2-го уровня, вложены в протокол 1-го, и не зависят от него, поэтому на 1-м уровне может быть что угодно.
А данные протокола 3-го уровня ничего не знают о 2-м и 1-м уровне, поэтому на 1 и 2 может быть что угодно.

Как на почте: можно письмо положить в контейнер для самолета, а можно - в контейнер для корабля.

—-

Тут многое в контексте, но как начальное определение ИМХО полноценно.
Не создаёт спорных кривотолков и не ограничивает областей применения.
это лучшее объяснение инкапсуляции что я видел. большое спасибо. не знаю понял ли я , но вроде более менее стало ясно  . пойду почитаю про уровни
источник

ВС

Владимир Свешников... in NodeUA - JavaScript and Node.js in Ukraine
1
это лучшее объяснение инкапсуляции что я видел. большое спасибо. не знаю понял ли я , но вроде более менее стало ясно  . пойду почитаю про уровни
Это круто )
Спасибо )
Но всё же это только маленький фундамент.
Постарайтесь с него посмотреть по сторонам и сформировать своё конкретное мнение.
Все его понимают по своему, потому что область применения у него обширная.
источник

1

1 in NodeUA - JavaScript and Node.js in Ukraine
Владимир Свешников
Это круто )
Спасибо )
Но всё же это только маленький фундамент.
Постарайтесь с него посмотреть по сторонам и сформировать своё конкретное мнение.
Все его понимают по своему, потому что область применения у него обширная.
да, я неделю читал ломал голову вообще  ничего не было понятно, а тут есть теперь хоть от чего отталкиваться.
источник

MD

Mikhail Demidoff in NodeUA - JavaScript and Node.js in Ukraine
Я написал выше
источник

ro

roma ogurchik in NodeUA - JavaScript and Node.js in Ukraine
Mikhail Demidoff
То что вы написали — сокрытие данных
Это такой тонкий троллинг, не?
https://www.youtube.com/watch?v=yNUJ3vAeyJQ
источник

MD

Mikhail Demidoff in NodeUA - JavaScript and Node.js in Ukraine
roma ogurchik
Это такой тонкий троллинг, не?
https://www.youtube.com/watch?v=yNUJ3vAeyJQ
?
Я так полагаю, вы не читали, что я писал
источник

MD

Mikhail Demidoff in NodeUA - JavaScript and Node.js in Ukraine
Mikhail Demidoff
Инкапсуляция это достаточно просто: это размещение в одной сущности данных и методов, которые работают с этими данными. Некоторые ошибочно полагают, что инкапсуляция это сокрытие данных, но это лишь одна из возможностей инкапсуляции, и таковой не является)
.
источник
2020 January 29

NK

ID:0 in NodeUA - JavaScript and Node.js in Ukraine
источник

I

Ivan in NodeUA - JavaScript and Node.js in Ukraine
По инкапсуляции, если речь идет об инкапсуляции в ООП.

1. Самое авторитетное мнение можно найти на сайте Ward Cunningham http://wiki.c2.com/?ObjectOriented
2. Самое понятное разъяснение можно прочитать в “Code Complete” 2nd edition by Steve McConnell.
3. Самое глубокое и научное разъяснение можно найти в "Библии ООП" - “Object-Oriented Software Construction” 2nd edition by Bertrand Meyer (здесь же рассматривается и encapsulation of non-object-oriented software)
4. Самую первозданную идею ООП (включая инкапсуляцию) можно найти в письмах Alan Kay (автора термина ООП):
http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented

http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en
источник

¿

¿hope in NodeUA - JavaScript and Node.js in Ukraine
Ivan
По инкапсуляции, если речь идет об инкапсуляции в ООП.

1. Самое авторитетное мнение можно найти на сайте Ward Cunningham http://wiki.c2.com/?ObjectOriented
2. Самое понятное разъяснение можно прочитать в “Code Complete” 2nd edition by Steve McConnell.
3. Самое глубокое и научное разъяснение можно найти в "Библии ООП" - “Object-Oriented Software Construction” 2nd edition by Bertrand Meyer (здесь же рассматривается и encapsulation of non-object-oriented software)
4. Самую первозданную идею ООП (включая инкапсуляцию) можно найти в письмах Alan Kay (автора термина ООП):
http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented

http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en
Я бы сюда ещё добавил "Чистая Архитектура" Роберта Мартина и классику - "Шаблоны Проектирования" банды 4-х.
источник

I

Ivan in NodeUA - JavaScript and Node.js in Ukraine
¿hope
Я бы сюда ещё добавил "Чистая Архитектура" Роберта Мартина и классику - "Шаблоны Проектирования" банды 4-х.
Я уже не помню, но, по моему, более хорошо (чем в Чистой Архитектуре) он раскрывает эту тему в “Agile Software Development. Principles, Patterns, and Practices.” by Robert C. Martin, James W. Newkirk, Robert S. Koss. Нужно смотреть.

А по поводу ГОФ - да, соглассен, в глассарии у них хорошие определения. И в одной из глав они раскрывают эту тему.

Кстати, очень хороший глоссарий еще и Крэга Лармана в “Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development”.

Но тройка китов - это, все равно:
1. Первоисточник - Alan Kay
2. Авторитет - Ward Cunningham
3. Научные изыскания - Bertrand Meyer
источник

GS

German Swan in NodeUA - JavaScript and Node.js in Ukraine
всем привет. просьба к опытным разрабам: помогите решить проблему плс.
задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла.
проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только rss, в то время как heap стабильно очищается. как видно в логах после полной прогрузки файла и выхода из функции main (по идее все ссылки на dataStream должны очиститься garbage collector-ом) rss все еще занимает 64mb. в реальном проекте таких файлов много и желательно обрабатывать их параллельно, но из-за того что использование памяти постоянно растет, приложение просто падает.
вопрос: почему так происходит (может это баг ноды?) и можно ли до закрытия стрима удалять из памяти чанки, которые уже обработаны?
гуглить пробовал. проверять дампы памяти в chrome inspect-е тоже - там только ссылки на какие-то внутренние объекты движка.

Код:
const https = require('https');
const source = 'https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nyc_pluto_19v2_csv.zip';

const consoleMemory = () => {
 const m = process.memoryUsage();
 for (const key of Reflect.ownKeys(m)) {
   m[key] = ~~(m[key] / 1024 / 1024);
 }
 console.log(m);
}

const getDataStream = () => {
 return new Promise((resolve) => {
   https.get(source, resolve);
 });
}

const main = () => new Promise(async (resolve) => {
 const dataStream = await getDataStream();
 let c = 0;
 dataStream.on('data', (data) => {
   c++;
   if (c % 1000) return;
   consoleMemory();
 });
 dataStream.on('end', resolve);
});

(async () => {
 consoleMemory();
 await main();
 await new Promise(res => setTimeout(res, 5000));
 consoleMemory();
})();


Логи:

{rss: 25, heapTotal: 9, heapUsed: 5, external: 0}
{rss: 41, heapTotal: 16, heapUsed: 6, external: 1}
{rss: 51, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 54, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 56, heapTotal: 17, heapUsed: 6, external: 2}
{rss: 57, heapTotal: 17, heapUsed: 6, external: 1}
{rss: 58, heapTotal: 17, heapUsed: 6, external: 0}
{rss: 59, heapTotal: 17, heapUsed: 10, external: 13}
{rss: 60, heapTotal: 17, heapUsed: 9, external: 12}
{rss: 61, heapTotal: 17, heapUsed: 9, external: 11}
{rss: 62, heapTotal: 17, heapUsed: 9, external: 10}
{rss: 63, heapTotal: 17, heapUsed: 9, external: 9}
{rss: 64, heapTotal: 17, heapUsed: 7, external: 2}
источник

R

Rustam in NodeUA - JavaScript and Node.js in Ukraine
German Swan
всем привет. просьба к опытным разрабам: помогите решить проблему плс.
задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла.
проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только rss, в то время как heap стабильно очищается. как видно в логах после полной прогрузки файла и выхода из функции main (по идее все ссылки на dataStream должны очиститься garbage collector-ом) rss все еще занимает 64mb. в реальном проекте таких файлов много и желательно обрабатывать их параллельно, но из-за того что использование памяти постоянно растет, приложение просто падает.
вопрос: почему так происходит (может это баг ноды?) и можно ли до закрытия стрима удалять из памяти чанки, которые уже обработаны?
гуглить пробовал. проверять дампы памяти в chrome inspect-е тоже - там только ссылки на какие-то внутренние объекты движка.

Код:
const https = require('https');
const source = 'https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nyc_pluto_19v2_csv.zip';

const consoleMemory = () => {
 const m = process.memoryUsage();
 for (const key of Reflect.ownKeys(m)) {
   m[key] = ~~(m[key] / 1024 / 1024);
 }
 console.log(m);
}

const getDataStream = () => {
 return new Promise((resolve) => {
   https.get(source, resolve);
 });
}

const main = () => new Promise(async (resolve) => {
 const dataStream = await getDataStream();
 let c = 0;
 dataStream.on('data', (data) => {
   c++;
   if (c % 1000) return;
   consoleMemory();
 });
 dataStream.on('end', resolve);
});

(async () => {
 consoleMemory();
 await main();
 await new Promise(res => setTimeout(res, 5000));
 consoleMemory();
})();


Логи:

{rss: 25, heapTotal: 9, heapUsed: 5, external: 0}
{rss: 41, heapTotal: 16, heapUsed: 6, external: 1}
{rss: 51, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 54, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 56, heapTotal: 17, heapUsed: 6, external: 2}
{rss: 57, heapTotal: 17, heapUsed: 6, external: 1}
{rss: 58, heapTotal: 17, heapUsed: 6, external: 0}
{rss: 59, heapTotal: 17, heapUsed: 10, external: 13}
{rss: 60, heapTotal: 17, heapUsed: 9, external: 12}
{rss: 61, heapTotal: 17, heapUsed: 9, external: 11}
{rss: 62, heapTotal: 17, heapUsed: 9, external: 10}
{rss: 63, heapTotal: 17, heapUsed: 9, external: 9}
{rss: 64, heapTotal: 17, heapUsed: 7, external: 2}
{ rss: 18, heapTotal: 4, heapUsed: 2, external: 1 }
{ rss: 35, heapTotal: 7, heapUsed: 4, external: 9 }
{ rss: 29, heapTotal: 8, heapUsed: 3, external: 2 }
{ rss: 42, heapTotal: 8, heapUsed: 3, external: 14 }
{ rss: 26, heapTotal: 4, heapUsed: 2, external: 1 }
{ rss: 38, heapTotal: 4, heapUsed: 2, external: 13 }
{ rss: 52, heapTotal: 4, heapUsed: 3, external: 26 }
{ rss: 36, heapTotal: 4, heapUsed: 2, external: 11 }
{ rss: 50, heapTotal: 4, heapUsed: 3, external: 24 }
{ rss: 34, heapTotal: 4, heapUsed: 2, external: 9 }
{ rss: 48, heapTotal: 4, heapUsed: 3, external: 22 }
{ rss: 32, heapTotal: 4, heapUsed: 2, external: 7 }
источник

R

Rustam in NodeUA - JavaScript and Node.js in Ukraine
German Swan
всем привет. просьба к опытным разрабам: помогите решить проблему плс.
задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла.
проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только rss, в то время как heap стабильно очищается. как видно в логах после полной прогрузки файла и выхода из функции main (по идее все ссылки на dataStream должны очиститься garbage collector-ом) rss все еще занимает 64mb. в реальном проекте таких файлов много и желательно обрабатывать их параллельно, но из-за того что использование памяти постоянно растет, приложение просто падает.
вопрос: почему так происходит (может это баг ноды?) и можно ли до закрытия стрима удалять из памяти чанки, которые уже обработаны?
гуглить пробовал. проверять дампы памяти в chrome inspect-е тоже - там только ссылки на какие-то внутренние объекты движка.

Код:
const https = require('https');
const source = 'https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nyc_pluto_19v2_csv.zip';

const consoleMemory = () => {
 const m = process.memoryUsage();
 for (const key of Reflect.ownKeys(m)) {
   m[key] = ~~(m[key] / 1024 / 1024);
 }
 console.log(m);
}

const getDataStream = () => {
 return new Promise((resolve) => {
   https.get(source, resolve);
 });
}

const main = () => new Promise(async (resolve) => {
 const dataStream = await getDataStream();
 let c = 0;
 dataStream.on('data', (data) => {
   c++;
   if (c % 1000) return;
   consoleMemory();
 });
 dataStream.on('end', resolve);
});

(async () => {
 consoleMemory();
 await main();
 await new Promise(res => setTimeout(res, 5000));
 consoleMemory();
})();


Логи:

{rss: 25, heapTotal: 9, heapUsed: 5, external: 0}
{rss: 41, heapTotal: 16, heapUsed: 6, external: 1}
{rss: 51, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 54, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 56, heapTotal: 17, heapUsed: 6, external: 2}
{rss: 57, heapTotal: 17, heapUsed: 6, external: 1}
{rss: 58, heapTotal: 17, heapUsed: 6, external: 0}
{rss: 59, heapTotal: 17, heapUsed: 10, external: 13}
{rss: 60, heapTotal: 17, heapUsed: 9, external: 12}
{rss: 61, heapTotal: 17, heapUsed: 9, external: 11}
{rss: 62, heapTotal: 17, heapUsed: 9, external: 10}
{rss: 63, heapTotal: 17, heapUsed: 9, external: 9}
{rss: 64, heapTotal: 17, heapUsed: 7, external: 2}
На моей машине, node v12.14.1
источник

GS

German Swan in NodeUA - JavaScript and Node.js in Ukraine
интересно. у меня v10.15.3, попробую апгрейднуться
источник

MD

Mikhail Demidoff in NodeUA - JavaScript and Node.js in Ukraine
German Swan
интересно. у меня v10.15.3, попробую апгрейднуться
{ rss: 19, heapTotal: 5, heapUsed: 2, external: 1 }
{ rss: 39, heapTotal: 8, heapUsed: 4, external: 10 }
{ rss: 49, heapTotal: 8, heapUsed: 3, external: 6 }
{ rss: 49, heapTotal: 8, heapUsed: 4, external: 18 }
{ rss: 62, heapTotal: 8, heapUsed: 4, external: 30 }
{ rss: 75, heapTotal: 8, heapUsed: 5, external: 43 }
{ rss: 68, heapTotal: 4, heapUsed: 2, external: 4 }
{ rss: 67, heapTotal: 4, heapUsed: 3, external: 10 }
{ rss: 74, heapTotal: 4, heapUsed: 3, external: 22 }
{ rss: 76, heapTotal: 4, heapUsed: 2, external: 8 }
{ rss: 76, heapTotal: 4, heapUsed: 3, external: 20 }
{ rss: 76, heapTotal: 4, heapUsed: 2, external: 7 }
{ rss: 76, heapTotal: 4, heapUsed: 3, external: 13 }


v13.7.0
источник

GS

German Swan in NodeUA - JavaScript and Node.js in Ukraine
да, апгрейд не сильно помог, я так понимаю буфферы перенесли из кучи в external, но rss не особо очищается, в итоге приложение падает все равно
источник

АП

Алексей Попов... in NodeUA - JavaScript and Node.js in Ukraine
German Swan
всем привет. просьба к опытным разрабам: помогите решить проблему плс.
задача: получить стрим большого файла (пол гига примерно) и обрабатывать его чанками, что бы не хранить весь файл в памяти и не ждать полной загрузки файла.
проблема: написав следующий код я обнаружил, что по мере загрузки файла увеличивается использование памяти, при чем только rss, в то время как heap стабильно очищается. как видно в логах после полной прогрузки файла и выхода из функции main (по идее все ссылки на dataStream должны очиститься garbage collector-ом) rss все еще занимает 64mb. в реальном проекте таких файлов много и желательно обрабатывать их параллельно, но из-за того что использование памяти постоянно растет, приложение просто падает.
вопрос: почему так происходит (может это баг ноды?) и можно ли до закрытия стрима удалять из памяти чанки, которые уже обработаны?
гуглить пробовал. проверять дампы памяти в chrome inspect-е тоже - там только ссылки на какие-то внутренние объекты движка.

Код:
const https = require('https');
const source = 'https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nyc_pluto_19v2_csv.zip';

const consoleMemory = () => {
 const m = process.memoryUsage();
 for (const key of Reflect.ownKeys(m)) {
   m[key] = ~~(m[key] / 1024 / 1024);
 }
 console.log(m);
}

const getDataStream = () => {
 return new Promise((resolve) => {
   https.get(source, resolve);
 });
}

const main = () => new Promise(async (resolve) => {
 const dataStream = await getDataStream();
 let c = 0;
 dataStream.on('data', (data) => {
   c++;
   if (c % 1000) return;
   consoleMemory();
 });
 dataStream.on('end', resolve);
});

(async () => {
 consoleMemory();
 await main();
 await new Promise(res => setTimeout(res, 5000));
 consoleMemory();
})();


Логи:

{rss: 25, heapTotal: 9, heapUsed: 5, external: 0}
{rss: 41, heapTotal: 16, heapUsed: 6, external: 1}
{rss: 51, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 54, heapTotal: 16, heapUsed: 7, external: 2}
{rss: 56, heapTotal: 17, heapUsed: 6, external: 2}
{rss: 57, heapTotal: 17, heapUsed: 6, external: 1}
{rss: 58, heapTotal: 17, heapUsed: 6, external: 0}
{rss: 59, heapTotal: 17, heapUsed: 10, external: 13}
{rss: 60, heapTotal: 17, heapUsed: 9, external: 12}
{rss: 61, heapTotal: 17, heapUsed: 9, external: 11}
{rss: 62, heapTotal: 17, heapUsed: 9, external: 10}
{rss: 63, heapTotal: 17, heapUsed: 9, external: 9}
{rss: 64, heapTotal: 17, heapUsed: 7, external: 2}
возможно проще обойти проблему, чем бороться с ней? например, создать пул дочерних процессов, в которых обрабатывать файлы, и периодически эти процессы убивать и пересоздавать
источник