问题描述:
我目前正在做一个Python项目,涉及多处理,需要高效的数据通信。我处理的数据存储在一个列表中,列表中的每个元素都是自定义的数据类型。挑战是实现超快的数据检索,目标是微秒级的性能。
具体要求:
1.**数据内容:**要传递的数据是一个列表,包含自定义数据类型,如pyqt中的QPointF。
1.**性能目标:**数据检索过程需要尽可能快,目标是微秒级的效率。
1.**可用性:**一旦检索到数据,它应该是直接可用的,无需额外的处理或组织。
以前的尝试:
我已经探索了**multiprocessing
**模块中的各种解决方案,包括:
*multiprocessing.Queue
*multiprocessing.Pipe
*multiprocessing.managers.ShareableList
*multiprocessing.shared_memory.SharedMemory
不幸的是,这些方法都没有达到预期的速度和可用性标准。**Queue
和Pipe
的检索时间都在毫秒范围内,而ShareableList
和SharedMemory
**不支持包含自定义数据类型的列表,需要额外的检索后组织。
请求指导:
我正在寻求关于Python**multiprocessing
**模块或任何其他相关库中的替代方法或最佳实践的建议或见解,以实现包含自定义数据类型的列表的高效微秒级数据通信。
问题摘要:
在处理包含自定义数据类型的列表时,还有什么其他方法或途径可以在**multiprocessing
模块中实现高速数据通信(微秒级)?之前使用Queue
、Pipe
、ShareableList
和SharedMemory
**的尝试都失败了。如果您有任何意见或建议,我们将不胜感激。谢谢!
1条答案
按热度按时间lqfhib0f1#
TL; DR -在开箱即用的Python中几乎不可能获得微秒级的计时。下面是一个使用SharedMemory的纯Python的可能的家庭解决方案,它接近并可能激发您自己的开发
Python中的微秒计时是一个相当残酷的目标。(插入关于在性能敏感的任务中使用Python的强制性咆哮)我认为专注于低延迟并允许一些错过的消息可以让我们接近你想要的。
这里的方法是双circular buffer。第一个缓冲区是固定步幅的,用于快速查找,并告诉您在另一个缓冲区中找到起始/停止点。由于没有提到固定的数据大小,因此很难用单个缓冲区完成您想要的任务,双循环缓冲区可以帮助您实现这一点,其中第一个缓冲区是固定步幅的(因此我们可以直接跳到感兴趣的数据),第二个是容纳数据的大小(但是我们可以直接跳到感兴趣的数据,因为第一个已经告诉我们它在哪里)。本质上,一个只是另一个中pickle对象的内存Map。在这个实现中,数据可以在被读取之前被覆盖,并且它支持任意数量的消费者。它可以被调整为在单个消费者中等待读取后覆盖,没有丢失消息配置。我相信这里有很多优化,给出了关于正在移动的数据的更好的知识。
我放了大量的评论来解释这个逻辑,但请随时在评论中提出后续问题。
我假设你的所有对象都是可picklable的,或者可以被设置为这样,因为你提到了
multiprocessing.Queue
,它已经有了这个要求。您的要求:
__reduce__
方法according to the docs,所以它应该可以正常工作,就像大多数常见的对象一样。如果它没有,你可以总是 Package 它,尽管我知道你没有“[额外]组织”的要求。性能:在我的Windows 10,i9- 10900 K,2667 MHz RAM,Python 3.11.4上,我可以将1000
int
numpy.array
的读取时间降低到大约4.8微秒,并且每个int
读取大约1.2微秒。字符串
这里有一个小图,简要显示了内存是如何组织的。How the memory is organized