У меня есть тестовая установка, которая запускает сообщения через последовательный порт на 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).
Как мне это реализовать? Это правильное использование многопроцессорной обработки?