Выполнить большую программу C путем создания промежуточных этапов - PullRequest
0 голосов
/ 19 января 2012

У меня есть алгоритм, который занимает 7 дней, чтобы выполнить до завершения (и еще несколько алгоритмов тоже)

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

Поэтому я хотел бы спросить способ, с помощью которого я могу заставить мою программу выполняться поэтапно (скажем, на каждой фазе)генерирует результаты A, B, C, ...) и теперь, в случае потери мощности, я могу кое-как использовать эти промежуточные результаты и продолжить / возобновить запуск с этой точки.

Проблема 2: Как я будупредотвратить повторное открытие файла при каждой итерации цикла (fopen был помещен в цикл, который выполняется почти миллион раз, это было необходимо, так как файл изменяется при каждой итерации)

Ответы [ 5 ]

2 голосов
/ 19 января 2012

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

2 голосов
/ 19 января 2012

Ну, несколько вариантов, я думаю:

  1. Вы разбиваете свой алгоритм по разумным линиям с этим определенным выходом из фазы, которая может быть входом для следующей фазы.Затем настройте свой алгоритм как рабочий процесс (в идеале, с мягкой настройкой через некоторый файл объявления.
  2. . Вы добавляете логику в свой алгоритм, с помощью которой он знает, что он успешно завершил (подтвердил). Затем, при неудаче, вы можетеперезапустите алгоритм, и он объединит все незафиксированные данные и перезапустится с последней точки фиксации.

Обратите внимание, что обе эти опции могут продлить ваше 7-часовое время выполнения дальше!

Итак, для улучшенияобщее время выполнения, не могли бы вы также разделить свой алгоритм так, чтобы он содержал «рабочие» компоненты, которые могут параллельно работать над «заданиями». Это обычно означает создание некоторой «тупой», но интенсивной логики (такой как вычисления), которую можно параметризироватьЗатем у вас есть возможность запустить свой алгоритм на сетке / пространстве / облаке / чем угодно. По крайней мере, у вас есть варианты для сокращения времени выполнения. Даже не нужно быть пробелом ... просто используйте очереди (IBM MQСерия имеет интерфейс C) и просто слушатели на других ящиках слушают вашу очередь заданий и обрабатывают васВаши результаты, прежде чем сохранить результаты.Вы все еще можете поэтапно выполнить алгоритм, как обсуждалось выше.

2 голосов
/ 19 января 2012

Вы можете разделить его на несколько исходных файлов и использовать make.

0 голосов
/ 23 января 2012

Похоже на классическую проблему пакетной обработки для меня.
Вам нужно будет определить контрольные точки в вашем приложении и сохранять промежуточные данные до тех пор, пока контрольная точка не будет достигнута.позиция внутри файла.
Ваша обработка может занять больше времени, чем сейчас, но она будет более надежной.
В общем, вам следует подумать о узком месте в вашем алгоритме.
Для задачи 2 необходимо использовать два файлаВозможно, ваше приложение будет работать на несколько дней быстрее, если вы вызовете fopen в 1 миллион раз меньше ...

0 голосов
/ 23 января 2012

Проблема 2: Открытие файла на каждой итерации цикла, поскольку он изменяется

Возможно, я не совсем квалифицирован, чтобы ответить на этот вопрос, но выполнение fopen на каждой итерации (и fclose), вероятно, кажется расточительным и медленным. Чтобы ответить или получить более квалифицированный ответ, я думаю, нам нужно больше узнать о ваших данных.

Например:

  1. Текстовый или двоичный?
  2. Вы обрабатываете записи или поток текста? То есть это файл записей или поток данных? (вы не взламываете гены, не так ли?: -)

Я спрашиваю как, судя по вашему комментарию "потому что он менялся на каждой итерации", вам лучше использовать файл с произвольным доступом . Таким образом, я предполагаю, что вы снова открываете fseek до точки, которую вы, возможно, прошли (в своем потоке данных) и внесли изменения. Однако, если вы открываете файл в двоичном виде, вы можете fseek просмотреть его в любом месте, используя fsetpos и fseek. То есть вы можете «искать» в обратном направлении.

Кроме того, если ваши данные основаны на записях или каким-либо образом организованы, вы также можете создать для них индекс. при этом вы можете использовать fsetpos, чтобы установить указатель на интересующий вас индекс и пройти по нему. Таким образом, экономия времени при поиске области данных для изменения. Вы можете даже сохранить свой индекс в сопровождающем файле индекса.

Обратите внимание, что вы можете записать простой текст в двоичный файл. Возможно, стоит провести расследование?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...