Вот интересная проблема оптимизации, о которой я думаю уже несколько дней:
В системе я читаю данные с устройства медленного ввода-вывода. Я не знаю заранее, сколько данных мне нужно. Точная длина известна только после того, как я прочитал весь пакет (представьте, что у него есть какой-то символ конца). Чтение большего количества данных, чем требуется, не является проблемой, за исключением того, что оно тратит время на ввод-вывод.
В игру вступают также два ограничения: чтения очень медленные. Каждый байт, который я читаю, стоит. Кроме того, каждый запрос на чтение имеет постоянную стоимость установки независимо от количества прочитанных байтов. Это делает чтение побайтно дорогостоящим. Как правило: стоимость установки примерно такая же, как чтение 5 байтов.
Пакеты, которые я читаю, обычно имеют размер от 9 до 64 байтов, но в редких случаях встречаются пакеты большего или меньшего размера. Весь диапазон будет от 1 до 120 байтов.
Конечно, я знаю немного о моих данных: пакеты поставляются в последовательностях одинакового размера. Я могу классифицировать три модели здесь:
Последовательности чтения с одинаковыми размерами:
A A A A A ...
Чередующиеся последовательности:
A B A B A B A B ...
И последовательности троек:
A B C A B C A B C ...
Также существует особый случай вырожденных троек:
A A B A A B A A B ...
(здесь A, B и C обозначают некоторый размер упаковки от 1 до 120).
Вопрос:
Как рассчитать размер следующего запроса на чтение в зависимости от размера предыдущих пакетов? Мне нужно что-то, что быстро адаптируется, использует мало памяти (скажем, меньше 500 байт) и быстро с вычислительной точки зрения.
О - и предварительная генерация некоторых таблиц не будет работать, потому что статистика размеров чтения может сильно различаться в зависимости от устройств, с которых я читаю.
Есть идеи?