Эффективный способ сохранить данные на диск при выполнении в вычислительном отношении интенсивной задачи

Звучит так, будто ты хочешь либо rplaca, либо заменить. См. http://www.lispworks.com/documentation/HyperSpec/Body/f_rplaca.htm или http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#. заменить

5
задан machinaut 18 June 2009 в 17:38
поделиться

6 ответов

Если вы внедряете OpenMP в свою программу, то лучше использовать #pragma omp single или #pragma omp master из параллельной секции для сохранения в файл. Эти прагмы позволяют только одному потоку что-то выполнять. Итак, ваш код может выглядеть следующим образом:

#pragma omp parallel
{
    // Calculating the first part
    Calculate();

    // Using barrier to wait all threads
    #pragma omp barrier

    #pragma omp master
    SaveFirstPartOfResults();

    // Calculate the second part
    Calculate2();

    #pragma omp barrier

    #pragma omp master
    SaveSecondPart();

    Calculate3();

    // ... and so on
}

Здесь команда потоков будет выполнять вычисления, но только один поток сохранит результаты на диск.

Это похоже на программный конвейер. Предлагаю вам рассмотреть шаблон tbb :: pipeline из библиотеки Intel Threading Building Blocks. Я могу отослать вас к руководству по программным конвейерам по адресу http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=25 . Пожалуйста, прочтите пункт 4.2. Они решили проблему: один поток для чтения с диска, второй для обработки строк чтения, третий для сохранения на диск.

2
ответ дан 13 December 2019 в 19:33
поделиться

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

5
ответ дан 13 December 2019 в 19:33
поделиться

Первое решение, которое приходит на ум, в значительной степени совпадает с тем, что вы сказали, - иметь запись на диск в их собственном процессе с односторонним конвейером от сим-карты к устройству записи. Писатель пишет как можно быстрее (извлекая новые данные из конвейера). Проблема с этим в том, что если сим будет слишком далеко впереди писателя, сим все равно будет блокировать запись по каналу, и это будет связано с вводом / выводом при одном удалении.

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

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

3
ответ дан 13 December 2019 в 19:33
поделиться

* означает «указатель». Переменная объекта содержит указатель на объект, поэтому он имеет * ; переменная NSInteger содержит NSInteger, а не указатель на NSInteger, поэтому у нее нет * . Добавление * в эту переменную дает вам как минимум предупреждение, потому что вы помещаете целое число в переменную-указатель.

Запись огромных фрагментов данных обычно намного быстрее, чем запись небольших фрагментов.

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

Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.

С тех пор, как я проводил тесты, прошло некоторое время, но в прошлый раз это было значительно быстрее.

Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.

С тех пор, как я проводил тесты, прошло некоторое время, но в прошлый раз это было значительно быстрее.

Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.

право? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.

право? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.

1
ответ дан 13 December 2019 в 19:33
поделиться

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

0
ответ дан 13 December 2019 в 19:33
поделиться

Сделайте ваше приложение двумя потоками , одним для ЦП и одним для жесткого диска.

Попросите поток ЦП помещать завершенные данные в очередь, которую жестко диск затем поток извлекает данные по мере поступления данных.

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

С точки зрения реализации, вы могли бы сделайте очередь как объект с разделяемой памятью, но я думаю, что канал будет именно тем, что вы ищете. ЦП просто записывает в канал, когда это необходимо. На стороне жесткого диска вы просто читаете канал, и всякий раз, когда у вас есть достоверные данные, продолжайте оттуда.

0
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: