Commits

Dmitry Grebeniuk  committed dd58160

.

  • Participants
  • Parent commits de73d17

Comments (0)

Files changed (1)

   своевременное освобождение взятых ресурсов) -- об этом будет говориться
   ниже -- везде, где будет использоваться конкретный технический приём,
 
-- отделяют весь реальный ввод данных от их обработки.  Вводом данных
-  заведуют специальные функции (энумераторы; см.ниже), делом которых
-  является собственно получение данных из внешнего мира.  Если это
-  чтение файла, то должен быть специальный энумератор, который будет
-  открывать и гарантированно закрывать файл, будет выделять в памяти
-  ровно один буфер фиксированного размера, и будет читать файл блоками
-  данного размера, таким образом гарантируя постоянное использование
-  памяти и отсутствие тысяч системных вызовов там, где будет прочитан
-  и обработан один большой блок данных.
+  - отделяют весь реальный ввод данных от их обработки.  Вводом данных
+    заведуют специальные функции (энумераторы; см.ниже), делом которых
+    является собственно получение данных из внешнего мира.  Если это
+    чтение файла, то должен быть специальный энумератор, который будет
+    открывать и гарантированно закрывать файл, будет выделять в памяти
+    ровно один буфер фиксированного размера, и будет читать файл блоками
+    данного размера, таким образом гарантируя постоянное использование
+    памяти и отсутствие тысяч системных вызовов там, где будет прочитан
+    и обработан один большой блок данных,
+
+  - итераты обычно пишутся так, что, имея заданное количество входных
+    элементов, они используют ограниченный объём вычислений и памяти,
+    выдавая либо результат (значение или ошибку),
+
+  - часты случаи, когда каждая функция из цепочки обработки данных
+    выделяет фиксированный буфер, который затем используется при обработке
+    новых поступающих данных, таким образом используя фиксированную
+    память и снижая нагрузку на сборщик мусора,
 
 - позволяют писать вполне декларативный код, если есть желание
   выразить задачу в высокоуровневых терминах, и вполне низкоуровневый
   они органично вклеиваются, позволяя параллельную обработку
   нескольких потоков данных через lwt
 
+- так как итераты построены поверх базовой монады, которая может
+  поддерживать асинхронный ввод-вывод (например, lwt), итераты
+  наследуют эти свойства: все операции, неспецифичные для итератов,
+  выполняются только через базовую монаду.  Реализовав специальные
+  энумераторы, возможно использовать практически любую библиотеку
+  асинхронного ввода-вывода (например, libev), для этого достаточно
+  обрабатывать в энумераторе случай "данные будут позднее", просто
+  приостанавливая кормление текущего итерата и передавая управление
+  другим частям кода.
+
 - преимущества над окамловскими потоками (модуль Stream) таковы:
   - итераты всегда работают с чанками, тогда как в Stream чанки
     предусмотрены только для случаев чтения из in_channel,