- 主题:进程A怎么把N个超大数据连续发给另一个进程B
程序A是我的,数据原本自我闭环,用Rust写的。程序B是另一家单位的,想要引出A的内部数据做它们自己的科学研究,用C开发。
数据是3路实时图像帧,分别是10000×10000、5000×5000、5000×5000灰度图,帧率不算低,三路加起来大概1200MB/s,用上压缩顶多能降到1000MB/s,远超以太网传输带宽。
我觉得共享内存是个好办法,但是会和B进程耦合,我怕它们时序接不住,进而影响我发送时序。
写入磁盘交互,由于文件是多个离散的,磁盘IO成为很大的瓶颈,用PCIE4.0的固态硬盘也会造成阻塞。
有什么其他好办法能够不通过共享内存,高效地把数据从A给到B,哪怕B接不到?
--
FROM 221.218.140.*
谢谢,这个主意很好,不瞒您说昨晚我也想到一块去了。A进程自身也维护一个有限发送队列,满了以后扔一帧发一帧,留给B进程正比于队列长度的图像帧生命周期,进一步与B进程解耦。
【 在 gameplayer 的大作中提到: 】
: 还是共享内存最好吧.
: 担心耦合或者阻塞什么的,可以你自己封装一个库供两边使用,负责读写共享内存,这
: 样读端处理不及时时丢弃也好等待也好都能自己控制,不影响你这边的工作
: ...................
--
FROM 123.127.159.*
这个确实是,接近于linux的共享内存实现,windows没这么方便,没有这种内存文件
【 在 RunningOn 的大作中提到: 】
: unix socket,就是文件socket,仔细研究一下,和共享内存差不多快。
: windows不知道有没有这个文件socket。共享内存这个场景很靠谱的呀,需要你自己设计一下传输协议
:
--
FROM 123.127.159.*
我没试过,这个zmq的ipc能达到这种带宽吗
【 在 chunhui 的大作中提到: 】
: 你这个用zmq很合适。ipc 本地传输。
--
FROM 123.127.159.*
有具体对问题的高见吗
【 在 redfoxzheng 的大作中提到: 】
: 做程序员之前,至少你得好好读读书。但凡认真读过几本书,也没你这个疑问
: 发自「今日水木 on 24129PN74C」
--
FROM 123.127.159.*
我用了zstd,level 3以下基本满足10000×10000的处理实时性,但只能压缩至原大小的90%;level 10的压缩能到55%,但时间是4秒左右,已经无法接受了。
【 在 tower6 的大作中提到: 】
: 灰度图找个靠谱的算法肯定不止这点压缩率,然后udp直接发就好了,接是B的问题了
--
FROM 123.127.159.*
这1、2结论过于绝对,以至于槽点略多……
【 在 redfoxzheng 的大作中提到: 】
: 1.两进程不在同一台物理机,除了socket通信,基本无其他方案。
: 2.如果在通一台物理机,最高效的就是共享内存。通用一点的考虑本地socket通信。
: 这些方案,但凡你看点操作系统,网络编程方面的书籍,也不至于两眼一麻黑,啥都不知道。就算别人告诉你方案,你还是满脑子问号。
: ...................
--
FROM 221.218.140.*
对的,和Linux对比,区别是Windows的内存映射文件缺少生命周期,因而一个共享资源在被B拿到之前,不能被A扔掉
【 在 harrycheng 的大作中提到: 】
: 刚刚问chatgpt,它表示windows有内存映射文件,c/pp代码如下:
: HANDLE hMapFile = CreateFileMapping(
: INVALID_HANDLE_VALUE, // 使用内存而不是磁盘文件
: ...................
--
FROM 221.218.140.*
不会吧,我之前用zeromq、nanomsg、nng时,传输似乎利用管道。现在能突破管道吗?
【 在 chunhui 的大作中提到: 】
: 1GB每秒?这也太容易了。
--
FROM 221.218.140.*
宏观是这个模型,细节需要时序。例如反过来假如没有时序约束,那么A内存有溢出风险,或者B完全收不到还活着的内存块。这个约束要么是静态靠某种设计约束,要么是运行时靠通信约束。@gameplayer 说的和我想的一样,静态靠设计约束,这样我就要写个配套的接收lib给B进程调用
【 在 xiaokang 的大作中提到: 】
: 不就是一个生产者-消费者问题吗?
: 怎么会有耦合这种想法?
: 怎么会有时序这种想法?
: ...................
--
FROM 221.218.140.*