Использование многопроцессорной обработки для периодического сохранения файлов - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть тестовая установка, которая запускает сообщения через последовательный порт на 10 кГц.

Я пытаюсь записать и сохранить их в .csv со скриптом Python, но я обнаружил, что если я хочу запустить тест в течение длительного времени (часы или дни) Python жалуется, когда я пытаюсь сохранить все в одном списке и сохранить его после завершения теста.

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

Мой следующий подход состоял в том, чтобы использовать многопроцессорную обработку для создания sh буферной системы, в которой я сохраняю последовательные сообщения в буфере A, одновременно сохраняя буфер B для разделения файлов .csv, а затем переключаясь между ними до тех пор, пока тест завершен.

manager = multiprocessing.Manager()
return_dict = manager.dict()

return_dict[0] = []
return_dict[1] = []

recordA = multiprocessing.Process(target=record,args=(0,return_dict,quartersamples,result,)) 
saveB = multiprocessing.Process(target=save,args=(1,return_dict,fulltitle[textcount],elapsed,textcount,))

recordA.start()
saveB.start()

recordA.join()
saveB.join()

textcount += 1

saveA = multiprocessing.Process(target=save,args=(0,return_dict,fulltitle[textcount],elapsed,textcount))
recordB = multiprocessing.Process(target=record,args=(1,return_dict,quartersamples,result,)) 

saveA.start()
recordB.start()

saveA.join()
recordB.join()

textcount += 1

Я не уверен, насколько эффективно это решение - между отметками времени в .csv все еще есть задержка. Я подозреваю, что это потому, что я должен передать содержимое буферов return_dict от одного процесса другому через менеджер, но я не уверен.

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

... но я не уверен, как это сделать, потому что это предполагает два процесса взаимодействуют друг с другом на полпути во время работы (ie. буфер A заполнен, пришло время начинать заполнять B).

Как мне это реализовать? Это правильное использование многопроцессорной обработки?

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