【发布时间】:2018-08-22 17:01:01
【问题描述】:
情境化
我正在编写一个程序,该程序能够从传感器读取数据,然后对其进行处理。目前我希望它被发送到服务器。我有两个通过套接字进行通信的进程,一个读取数据并将其存储到临时文件,另一个读取临时文件,将数据发送到服务器。
问题
这个问题实际上从未在测试中出现,但是我意识到如果采样频率很高,两个进程很有可能同时尝试读/写文件(不是他们完全同时请求它,而是一个尝试在另一个关闭它之前打开它)。
即使这不会引发错误(对于我在线阅读的内容,某些操作系统不会将锁放入文件中),它也可能导致巨大的版本不兼容错误,从而导致数据丢失。因此,这种处理数据的方式看起来不太合适。
我自己的想法/方法
我想在内存(数据缓冲区)中使用类似文件的对象。我对 Python 中的这个概念没有经验,所以我进行了一些研究,我了解到 [缓冲区] 就像一个文件,它在程序执行时保存在内存中,并且具有与标准系统非常相似的属性文件。我认为使用它可能是个好主意,但是我找不到解决其中一些不便的方法:
-
既然它仍然是 like 一个文件(类文件对象),如果两个进程在对象上的操作一致,会不会出现版本不兼容错误/错误?我只需要追加数据与一个进程(在最后)和从一开始就与另一个进程删除数据(作为某种队列)。这个 Python 功能是否允许这样做,如果允许,我可以在文档中查看哪些方法?
-
对于上面的解释,我考虑过使用队列;然而,这在时间方面可能是低效的执行(附加到列表相当快,但根据我在自己的机器上进行的测试以查看哪种对象类型最适合,附加到 pandas 对象的速度要慢大约 1000 倍)。是否有一个对象(如果不是类似文件的对象)可以让我这样做并且高效?我知道效率是主观的,所以假设每秒 100 次追加,没有明显的延迟(在这种情况下时间戳很重要)。
-
由于我使用了两个不同的进程并且它们在 Python 中不共享内存,在对类文件对象进行操作时是否仍然可以指向相同的内存地址?正如我所说,我用套接字与它们通信,但该方法是 afaik 按值调用,而不是引用;所以这对我来说似乎是一个严重的问题(也许有必要将它们合并到两个线程而不是不同的 python 进程中?)
如果需要,您可以评论询问任何其他细节,我将很乐意回答。
编辑:在 cmets 中提出的问题:
您是如何创建这些流程的?通过一个 Python 模块,比如
multiprocessing或subprocess,还是其他方式?
我将它们作为两个完全独立的程序运行。每个都有一个由 shell 脚本调用的不同的主要 python 文件;但是,如果需要,我可以灵活地更改此行为。
另一方面,从传感器读取数据的进程有两个线程:一个是从字面上读取数据,另一个是侦听套接字请求。
您从传感器获取什么类型的数据并将其发送到 服务器?
我发送的表格通常包含浮点数,但传感器也可能产生视频流或其他类型的数据结构。
对队列的误解 |熊猫
我知道队列与数据帧无关;我只是说我尝试使用数据帧但它表现不佳,因为它被认为预先分配了它需要的内存空间(如果我是对的)。我只是表达了我对解决方案性能的担忧。
【问题讨论】:
-
您是如何创建这些流程的?通过
multiprocessing或subprocess之类的 Python 模块,或其他方式? -
您需要当前使用的磁盘文件吗?您考虑并拒绝使用队列,因为附加到 pandas 对象的效率低下:这不是很清楚 - 您从传感器获取什么类型的数据并将其发送到服务器?
-
顺便说一句,您误解了什么是类文件对象。类文件对象是提供类似于文件的 Python 接口的任何对象(通常是
read或write和逐行迭代等方法),无论对象背后的底层机制如何。它可以是像io.StringIO这样的内存存储,也可以是普通文件,也可以是管道或套接字周围的包装器或许多其他东西。 -
@user2357112 谢谢你的解释:)。我当然误解了什么是类文件对象
标签: python python-3.x buffer