Vladimir
Я вообще не понимаю людей которые используют лодаш и подобное
Gleb
Интересная задачка. Предположу что решение специально написанное под эту задачу окажется более эффективным чем решения предназначены для широкого круга задач вроде sql. И в качестве варианта я бы предположил бы рассмотреть ноду и хранение данных либо полностью в оперативке либо с использованием виртуальной памяти (своп) когда ос будет вытеснять на диск память которая не влезает в оперативку. А для сохранения данных записывать на диск только append-лог операций по данным. Но для начала нужно провести расчеты сколько места будут занимать эти данные. В ноде массив из ста групп где у каждой массив из миллиона 64 битных чисел у меня на маке занял 780 мегабайт. Соотвественно потребуется где-то 78 гигабайт оперативки если хранить все данные в памяти. Да это много но сейчас вполне возможно найти сервера и с большим количеством оперативки. При хранении данных ста групп в оперативке у меня 10k чтений из случайной группы случайного элемента заняло 1.5 миллисекунды. А в случае с виртуальной памятью эти 10k рандомных чтений занимают примерно 5 секунд что в 5 тысяч раз дольше. Но даже тысячу чтений за полсекунды тоже неплохой результат. Сомневаюсь что sql и большинство no-sql баз данных покажут такую скорость. Вот скрипт которым я проводил замеры var k = 100; var n = 1000000; var arr = new Array(k); for(var j = 0; j < k; j++){ arr[j] = new Array(n); for(var i = 0; i < n; i++){ arr[j][i] = Math.random(); } } setTimeout(bench,1000); function bench(){ var value = 0; var time = Date.now(); for(var i = 0; i < 10000; i++){ var index1 = Math.random()*k|0; var index2 = Math.random()*n|0; value+=arr[index1][index2]; } console.log(value, Date.now()-time); setTimeout(bench,1000) }
Да понятно что на NodeJS никто такое писать не будет, равно как и на любом другом языке с автоматизированной работой с памятью) К тому же у ограничение на Heap в 1.5Gb. Но мб на плюсах попробую накатать, не знаю даже...
Anonymous
Я вообще не понимаю людей которые используют лодаш и подобное
ну это как раз понять можно. стдлиба скудная. и есть готовые утилити функции, уже типизированные
Vladimir
настоящие разработчики сами пишут свои утилы
Anonymous
аларм
KlonD90
В каком плане?
Gleb
Я вообще не понимаю людей которые используют лодаш и подобное
Его имело смысл использовать то введения ES5 методов типа map или reduce.
Anonymous
айот и жс в одном предложении
Gleb
Ну я имею ввиду решения с компилированием JS. Всё таки в БД динамическую типизацию не очень хорошо впихивать, как бы там V8 её не оптимизировал.
Дима
Там же просто по возможностям урезанные версии
Anonymous
я вот только не понял bnoordhuis его идиотом назвал или нет?
Anonymous
или это такое тонкое
Vladimir
я вот только не понял bnoordhuis его идиотом назвал или нет?
Не. Он намекает, что он либо идиот либо мудак, и вроде бы он не идиот
Anonymous
ясненько
Gleb
Там же просто по возможностям урезанные версии
Ну в том отчасти и смысл) Вам же всё таки не нужен полный функционал какой-нибудь Node, верно?
Anonymous
Дима
Ну я имею ввиду решения с компилированием JS. Всё таки в БД динамическую типизацию не очень хорошо впихивать, как бы там V8 её не оптимизировал.
Даже если обмазаться гидрой и оптимизировать всё-всё-всё, то это всё равно наверное из ряда фантастики
usernameak
нашел в своем коде такой комментарий
Vladimir
Vladimir
@chicoxyzzy понеслось
Anonymous
это где?
Vladimir
там же
Богдан
Ну я имею ввиду решения с компилированием JS. Всё таки в БД динамическую типизацию не очень хорошо впихивать, как бы там V8 её не оптимизировал.
На самом деле после того как v8 оптимизирует функцию от динамической типизации не остается и следа - все объекты имеют строгий (скрытый внутри v8) тип, благодаря которому в скомпилированный ассемблер функция может загружать свойства прямо по смещению. В общем если не делать глупостей на js которые приводят к деоптимизациям или полиморфизму то быстродействие не сильно то и будет отличаться от кода написанного на плюсах, недаром есть статьи и доклады в которых сравнивают плюсы с жс и в некоторых случаях жс даже выигрывает. В итоге сравнивать с плюсами нужно больше по удобству разработки). И кстати есть еще другой момент - даже если в какие-то вещи мы выносим в с++ расширение к ноде то может даже оказаться что интероп(пересылка данных между с++ и js) окажется медленней чем работа с данными в самом джаваскрипте
Gleb
На самом деле после того как v8 оптимизирует функцию от динамической типизации не остается и следа - все объекты имеют строгий (скрытый внутри v8) тип, благодаря которому в скомпилированный ассемблер функция может загружать свойства прямо по смещению. В общем если не делать глупостей на js которые приводят к деоптимизациям или полиморфизму то быстродействие не сильно то и будет отличаться от кода написанного на плюсах, недаром есть статьи и доклады в которых сравнивают плюсы с жс и в некоторых случаях жс даже выигрывает. В итоге сравнивать с плюсами нужно больше по удобству разработки). И кстати есть еще другой момент - даже если в какие-то вещи мы выносим в с++ расширение к ноде то может даже оказаться что интероп(пересылка данных между с++ и js) окажется медленней чем работа с данными в самом джаваскрипте
Да, он оптимизирует ваш hashmap в вектор, но он во первых хранит тип (в том числе для примитивов), а во вторых GC и heap в 1.4Gb
Богдан
Да, он оптимизирует ваш hashmap в вектор, но он во первых хранит тип (в том числе для примитивов), а во вторых GC и heap в 1.4Gb
Если бы heap ограничивался бы 1.4 гигами то я бы не советовал бы ноду. Там просто дефолтные настройки такие, добавляем флаг --max_old_space_size и устанавливаем сколько угодно гигабайт. Насчет gs то во первых можно не создавать лишних объектов на каждый чих, а во вторых он достаточно быстр (по крайней мере где-то я читал что быстрее чем некоторые паттерны автоматического gs на плюсах вроде подсчета ссылок). Ясно что на плюсах есть все интрументы и можно все круто оптимизировать но стоят ли того затраты на удобства разработки (учитывая еще что нужно хорошо знать плюсы)
Sergey
Проблема ещё в том что в js много неявного приведения типов, это сложно как то оптимизировать
Таймураз
Камрады, вопрос такой созрел. Как наиболее эффективно хранить One-to-Many связи ооочень большого количества элементов. К примеру, 10000 групп по 1000000 объектов (строк, чисел, etc.). Варианты: 1). Тупо стандартное решение на SQL. Конечно БД пережуёт 10 млрд строк, но чёт мне подсказывает, что будут проблемс, в том числе и с маштабированием) 2). Array of * в PostgreSQL - список должен влезть в 1gb 3). Массивы в MongoDB - тут уже в 64 мб и как это будет работать при решардинге - непонятно 4). List в Cassandra (2^31 элементов) Задачи стандртные: 1). Получить список кусками 2). Добавить элемент в список (с проверкой на уникальность) 3). Удалить 4). Проверить существование в списке В качестве данных DWORD (16 бит) или строки < 30 символов. Хотелось бы услышать ваше мнение по поводу этих вариантов или рекомендации на какие-то другие БД.
У твоих элементов могут быть постоянные индексы?
Таймураз
Если да, то хранить всех кусками на разных серверах, за нужным индексом обращаться в определенную базу
Богдан
Да, он оптимизирует ваш hashmap в вектор, но он во первых хранит тип (в том числе для примитивов), а во вторых GC и heap в 1.4Gb
Насчет хранения типов для примитивом не совсем понятно. У v8 есть smi (типа int), флоаты и объекты и распознает он их там как-то по одному биту в значениии. Есть ситуации когда числа пакуются в объекты и тогда работа с ними медленная но это уже деоптимизация и таких ситуаций лучше избегать
Дима
А где почитать это?
Vladimir
https://github.com/nodejs/CTC/issues/164
Дима
Благодарю)
ikasymov
если функция возвращяет обьект ошибки то try catch что не увидит его? функция моя вызывается через await functionname()
ikasymov
ikasymov
он не выбрасывает ошибку
arts
Не return, а throw.
ikasymov
Не return, а throw.
то есть всегда я должен вместо return использовать throw? так как везде надо обрабытывать ошибку
Skeptic
то есть всегда я должен вместо return использовать throw? так как везде надо обрабытывать ошибку
Нет. Но в вашей функции ошибка не возникла, вы просто создали объект класса Error.
ikasymov
Нет. Но в вашей функции ошибка не возникла, вы просто создали объект класса Error.
да я понял, получается если я хочу обработать ошибку я должен не возвращять ошибку через return а через throw
Skeptic
Да
kdm🇩🇰
Привет! Такой вопрос: как можно посмотреть сколько кушает нода? и все чтобы в логи писалось upd: а все, нашел memwatch модуль
kdm🇩🇰
а то приложение падает с maximum call stack size
Zaur
а то приложение падает с maximum call stack size
Похоже что у тебя приложение где то уходит в рекурсию
Таймураз
Таймураз
А ещё в этой функции нет смысла
ikasymov
я так для примера
Таймураз
Не нужно на всё подряд вешать ключ async
ikasymov
я на всякие вешаю вдруг пригодиться
ikasymov
черем переписывать если нужен будет
Таймураз
Если нужно будет переписать- перепишешь А так- ты только замедляешь исполнение синхронного кода
Таймураз
Если у тебя будет много запросов- они все медленнее отработают Ты исполнение вполне банальных вещей растягиваешь во времени Смена контекста и тд происходит довольно быстро, но все равно проседание на нагрузках будет заметным
Таймураз
Да даже без нагрузки со сложной бизнес логикой разница будет заметна
Таймураз
Если взять абстрактный пример, в котором у тебя выполняется 100 вызовов функций синхронных, то только на промисах ты теряешь от 20мс на каждый запрос
ikasymov
Спасибо буду иметь ввиду
Anonymous
Привет всем, во время сборки минифицируете нодовские файлы?
arts
А смысл?
Anonymous
Вообще нет его просто чтобы одной сборкой за раз все сделать
arts
А что ты подразумеваешь под сборкой?
Zaur
А что ты подразумеваешь под сборкой?
node.min.js 😂 (простите, не удержался)
Anonymous
Да уже спрашивали, ну типо во время сборки клиентского js, захватить серверный без склейки кшн и в папку с билдом положить
Vitaly
А смысл?
arts
Если не юзаешь es6 import'ы, серверный код в сборке вообще не нуждается.
Vitaly
В пакете мог опечататься, но что-то похожее
arts
Есть и babel/register, но в прод такое пускать не хочется.
ikasymov
Почему этот код будет выполняться не асинхронно? forEach же возвращяет элемент колбеком, а колбек попадает в event loop let a = [1, 2, 3, 4, 5]; a.forEach(elem=>{ console.log(elem) })
Kons
forEach ничего не возвращает
ikasymov
forEach ничего не возвращает
forEach же возвращяет элемент колбеком ты с этим не согласен?
Kons
не согласен, конечно )
Sergey
Не всякий колбек колбекается ассинхронно
Kons
forEach выполняет функцию для каждого элемента массива. Возвращает _ничего_
Sergey
почему?
Потому что для ассинхронности нужно что то более чем вызов синхронной функции в цикле
Kons
почему?
А должен? )
ikasymov
forEach выполняет функцию для каждого элемента массива. Возвращает _ничего_
получается он будет ждать каждый элемент пока он выполниться?