Звучит так, будто ты хочешь либо rplaca, либо заменить. См. http://www.lispworks.com/documentation/HyperSpec/Body/f_rplaca.htm или http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#. заменить
Если вы внедряете 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. Они решили проблему: один поток для чтения с диска, второй для обработки строк чтения, третий для сохранения на диск.
Я бы сказал, что лучший способ - создать другой поток для сохранения данных, а не совершенно новый процесс; с новым процессом вы сталкиваетесь с проблемой передачи данных для сохранения через границу процесса, что создает новый набор трудностей.
Первое решение, которое приходит на ум, в значительной степени совпадает с тем, что вы сказали, - иметь запись на диск в их собственном процессе с односторонним конвейером от сим-карты к устройству записи. Писатель пишет как можно быстрее (извлекая новые данные из конвейера). Проблема с этим в том, что если сим будет слишком далеко впереди писателя, сим все равно будет блокировать запись по каналу, и это будет связано с вводом / выводом при одном удалении.
Проблема в том, что в Дело в том, что ваш цикл моделирования не завершен, пока он не выдаст результаты.
Второе, что приходит мне в голову, - это использовать неблокирующий ввод-вывод. Всякий раз, когда симке нужно писать, она должна делать это через неблокирующий ввод-вывод. При следующей необходимости записи он может забрать результаты предыдущей операции ввода-вывода (возможно, с небольшим ожиданием) перед запуском новой. тогда вы можете не возиться с конвейером и просто использовать неблокирующий ввод-вывод, потому что, если вы используете канал, он в конечном итоге заполнится, и сим в любом случае зависнет на вводе-выводе.
*
означает «указатель». Переменная объекта содержит указатель на объект, поэтому он имеет *
; переменная NSInteger содержит NSInteger, а не указатель на NSInteger, поэтому у нее нет *
. Добавление *
в эту переменную дает вам как минимум предупреждение, потому что вы помещаете целое число в переменную-указатель.
Что касается самой записи: рассмотрите возможность использования ввода-вывода с отображением памяти. Прошло некоторое время с тех пор, как я проводил тесты, но в прошлый раз это было значительно быстрее.
Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.
С тех пор, как я проводил тесты, прошло некоторое время, но в прошлый раз это было значительно быстрее.Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.
С тех пор, как я проводил тесты, прошло некоторое время, но в прошлый раз это было значительно быстрее.Также вы всегда можете немного поменять соотношение ЦП и ввода-вывода. Я думаю, вы сейчас пишете данные как необработанные несжатые данные, верно? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.
право? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода. право? Вы можете получить некоторую производительность ввода-вывода, если используете простую схему сжатия, чтобы уменьшить объем записываемых данных. С библиотекой ZLIB довольно легко работать, и она очень быстро сжимается на самом низком уровне сжатия. Это зависит от характера ваших данных, но если в них много избыточности, даже очень грубый алгоритм сжатия может устранить проблему ограничения ввода-вывода.Один поток постоянно выполняет шаг вычислительно-интенсивного процесса, а затем добавляет частичный результат в очередь частичных результатов. Другой поток постоянно удаляет частичные результаты из очереди и записывает их на диск. Обязательно синхронизируйте доступ к очереди. Очередь представляет собой структуру данных в виде списка, в которой вы можете добавлять элементы в конец и удалять элементы спереди.
Сделайте ваше приложение двумя потоками , одним для ЦП и одним для жесткого диска.
Попросите поток ЦП помещать завершенные данные в очередь, которую жестко диск затем поток извлекает данные по мере поступления данных.
Таким образом, ЦП просто избавляется от данных и позволяет кому-то другому обрабатывать их, а жесткий диск просто терпеливо ожидает появления любых данных в своей очереди.
С точки зрения реализации, вы могли бы сделайте очередь как объект с разделяемой памятью, но я думаю, что канал будет именно тем, что вы ищете. ЦП просто записывает в канал, когда это необходимо. На стороне жесткого диска вы просто читаете канал, и всякий раз, когда у вас есть достоверные данные, продолжайте оттуда.