Программный комплекс по биоинформатике. Сохранение прогресса алгоритмов

Одна из особенностей комплекса — возможность сохранения и восстановления состояния для большинства реализованных алгоритмов. Пара причин, по которым такой механизм действительно нужен:

  • Алгоритмы распознавания и некоторые вспомогательные алгоритмы (например, алгоритмы отбора предикатов для иерархических композиций) работают достаточно долго (от 10 минут до нескольких часов). Хотелось бы иметь возможность в любой момент прервать работу алгоритма и вернуться к нему позже. (При прерывании выполнения программы пользователем сохранение состояния алгоритма возможно за счет использования Runtime.addShutdownHook.)
  • Во многих случаях имеет ценность информация, связанная с алгоритмом (например, порядок используемой модели для распознавания). Желательно, чтобы эту информацию не требовалось хранить вручную.

Наиболее очевидный способ хранения структурированных данных в Java, который и был использован — сериализация средствами интерфейса java.io.Serializable. У этого метода есть недостатки (например, при изменении структуры наследования класса или его переименовании десериализация перестает работать), но при разумном процессе разработки количество встреч с ними минимально. Более того, разработка с оглядкой на сериализацию побуждает с самого начала создавать правильную иерархию классов и подбирать для классов подходящие поля.

Понятие алгоритма сосредоточено в интерфейсе Launchable:

Env — среда, в которой выполняется алгоритм; она, в частности, предоставляет доступ к параллельному выполнению кода (за счет ExecutorService) и выводу информации для пользователя.

Пример

Сохраняемый алгоритм, который производит некоторую операцию над целыми числами от 0 до max - 1, может выглядеть так:

У алгоритма есть два параметра, которые надо сохранять — max и последнее обработанное число last. Если прервать работу алгоритма и затем загрузить его заново, вычисления начнутся с того же числа, на котором они закончились при прерывании.

Приблизительный результат выполнения:

% java Enumerator
Уровень отладки: 2
eval(0)
Finished eval(0)
eval(1)
Finished eval(1)
eval(2)
^C
% java Enumerator
Уровень отладки: 2
eval(2)
Finished eval(2)
eval(3)
Finished eval(3)
...

Видно, что функция eval(2) выполняется дважды. В первый раз во время ее выполнения происходит прерывание, так что при запуске алгоритма заново вычисления надо проводить заново.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *