несколько записей на записывающем потоке в node.js - PullRequest
2 голосов
/ 18 апреля 2011

Я смотрел код грязного узла и заметил, что при записи большого количества данных в файл оригинальный программист решил объединить записи в несколько групп и выполнять записи групп по одной., но все они выдаются одновременно как часть одного цикла, без ожидания каких-либо обратных вызовов.У меня есть три вопроса по этому поводу.Мне нужно решить подобную проблему.

  1. Является ли это более эффективным способом?Должен ли я быть в комплекте записи тоже?
  2. Как выбрать оптимальный размер пачки?Почему бы просто не написать одну группу?
  3. Если я зарегистрируюсь в событии on («сток») на записывающем потоке, будет ли оно отправлено только один раз после завершения всех одновременно выполненных записей?Или после каждого?(моё предположение - первое)
  4. Если сработало («ошибка»), будет ли сгенерировано событие («утечка»)?Или они взаимоисключающие?

спасибо

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Является ли это более эффективным в некотором смысле? Должен ли я тоже связывать записи?

Неэффективно делать много маленьких записей. отправка команды записи имеет накладные расходы. Таким образом, запись всего 5 байтов вместо 1000 дороже.

Как выбрать оптимальный комплект размер? Почему бы просто не написать одну группу?

Оптимальный размер для меня звучит как чёрное искусство. Я полагаю, что есть веские причины, чтобы не делать это одно большое письмо. Возможно, начать писать раньше, чем позже. Немного эффективнее начать чуть раньше.

Если я подпишусь на событие «Слив» по письменному потоку, будет ли он испущен только один раз после всех одновременно выданные записи завершили? Или после каждый? (я думаю, это первое)

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

Если выбрано on ('error'), будет событие («утечка») также будет отправлено? Или они взаимоисключающие?

Даже если он испускается, не имеет смысла выполнять обработку ошибок в «канализации». Если произошла ошибка, я всегда предполагал, что вся операция записи потерпела неудачу, и не пытался восстановить в середине записи.

0 голосов
/ 22 апреля 2011

Для 4. Если включено («ошибка»), будет ли также генерироваться событие («утечка»)?Или они взаимоисключающие?

Вы беспокоитесь об этом, так как не хотите поддерживать правильное состояние в своем приложении.Итак, может быть, вы могли бы использовать вспомогательную функцию:

function not_if(proc, veto_inner) {
  var vetoed = false;
  return {
    proc: function() {
      if (!vetoed) { return proc.apply(null, arguments); }
    }, 
    vetoer: function() {
      if (!vetoed) {
        vetoed = true;
        veto_inner.apply(null, arguments);
    }
  };
}

Теперь вы можете установить обработчик «error» для вето, а обработчик «dri» - «proc», а не извлекать унылую информацию о том, что вызывается «слив»после вызова 'error'.

...