- 主题:进程A怎么把N个超大数据连续发给另一个进程B
不会吧,我之前用zeromq、nanomsg、nng时,传输似乎利用管道。现在能突破管道吗?
【 在 chunhui 的大作中提到: 】
: 1GB每秒?这也太容易了。
--
FROM 221.218.140.*
宏观是这个模型,细节需要时序。例如反过来假如没有时序约束,那么A内存有溢出风险,或者B完全收不到还活着的内存块。这个约束要么是静态靠某种设计约束,要么是运行时靠通信约束。@gameplayer 说的和我想的一样,静态靠设计约束,这样我就要写个配套的接收lib给B进程调用
【 在 xiaokang 的大作中提到: 】
: 不就是一个生产者-消费者问题吗?
: 怎么会有耦合这种想法?
: 怎么会有时序这种想法?
: ...................
--
FROM 221.218.140.*
也不太行,算了一下以level 10的4秒压缩时间,需要再快至少20倍才能赶上图像producer的生产速度,那么是否得分20个子线程?资源不够,电脑就是个不到30核的商用CPU
【 在 tower6 的大作中提到: 】
: 多线程分区压缩呢?
: :
--
FROM 221.218.140.*
信号量,信号量
【 在 AlphaO 的大作中提到: 】
: 宏观是这个模型,细节需要时序。例如反过来假如没有时序约束,那么A内存有溢出风险,或者B完全收不到还活着的内存块。这个约束要么是静态靠某种设计约束,要么是运行时靠通信约束。@gameplayer 说的和我想的一样,静态靠设计约束,这样我就要写个配套的接收lib给B进程调用
--
FROM 111.48.134.*
高屋建瓴,确实如此。但目前似乎没有更高级的库,只能用windows api?
【 在 eventvwr 的大作中提到: 】
: 搞个内存队列就行了。
--
FROM 221.218.140.*
要考虑的细节比较多,这几天我用windows api搭出来一个,不过缺点有2个。
一、Windows API底层调用,看着不爽利;
二、数据从A到B,额外多拷贝了1次,不是零拷贝的
本地还有个开关可以存图,此外正常流程里图还要拷给GPU和FPGA处理,原本就要拷贝3次,现在拷贝4次了,比较丑陋
现在缺少一个crate.io里的库
【 在 z16166 的大作中提到: 】
: 同一台机器,那必然是走内存最快啊
--
修改:AlphaO FROM 221.218.140.*
FROM 221.218.140.*
谢谢。
虽然现在我就类似这样,用Windows API实现的(信号邮箱用于交互元信息),但其实到头来还是得“拷贝”,从进程A的数据结构T,拷贝一部分结构T2到共享内存块SharedMemory中,然后共享给B进程映射回T2。
这里面多了一个拷贝到内存块的过程,看起来不是完全态的共享内存。
我也应该无法直接把SharedMemory定义在T或T2里(因为Windows API一旦使用,我暂时无法让它可Send(这是很高级的技巧,不容易搞好),没法配合程序里的大量多线程并行的架构,)
有没有什么更高级技巧,把在A进程里“零拷贝”把数据T映射到内核,然后内核再“零拷贝”映射到进程B中?有没有类似的库,把中间过程已经实现好了?
【 在 xiaokang 的大作中提到: 】
: 信号量,信号量
--
修改:AlphaO FROM 221.218.140.*
FROM 221.218.140.*
零拷贝的话,
只能是Rust这边先用CreateFileMapping分配好共享内存,
然后在这块共享内存里直接构造/映射出T、T2的布局,最好是让放在共享内存里的T、T2只包含POD类型的数据,这样Rust直接unsafe用裸指针就能读写。
Rust进程内如果要多线程读写这块内存,就加个Mutex或者自旋锁。
如果里面只是POD数据,可以通过 unsafe impl 为结构体T、T2手动实现 Send 和 Sync
【 在 AlphaO 的大作中提到: 】
: 谢谢。
: 虽然现在我就类似这样,用Windows API实现的(信号邮箱用于交互元信息),但其实到头来还是得“拷贝”,从进程A的数据结构T,拷贝一部分结构T2到共享内存块SharedMemory中,然后共享给B进程映射回T2。
: 这里面多了一个拷贝到内存块的过程,看起来不是完全态的共享内存。
: ...................
--
FROM 222.129.207.*
【 在 AlphaO 的大作中提到: 】
: 程序A是我的,数据原本自我闭环,用Rust写的。程序B是另一家单位的,想要引出A的内部数据做它们自己的科学研究,用C开发。
: 数据是3路实时图像帧,分别是10000×10000、5000×5000、5000×5000灰度图,帧率不算低,三路加起来大概1200MB/s,用上压缩顶多能降到1000MB/s,远超以太网传输带宽。
: 我觉得共享内存是个好办法,但是会和B进程耦合,我怕它们时序接不住,进而影响我发送时序。
: ...................
既然数据是有结构的, 直接发送有结构的共享内存数据块就够了呀。
数据生成有名字的共享内存块, 然后只需要把名字跨进程传递就够了。
--
FROM 124.126.1.*
你先补充知识再发话吧。操作系统原理你都未必学过,还大言不惭
【 在 AlphaO 的大作中提到: 】
:
: 这1、2结论过于绝对,以至于槽点略多……
: --
:
发自「今日水木 on 24129PN74C」
--
FROM 114.247.175.*