- 主题:进程A怎么把N个超大数据连续发给另一个进程B
也不太行,算了一下以level 10的4秒压缩时间,需要再快至少20倍才能赶上图像producer的生产速度,那么是否得分20个子线程?资源不够,电脑就是个不到30核的商用CPU
【 在 tower6 的大作中提到: 】
: 多线程分区压缩呢?
: :
--
FROM 221.218.140.*
高屋建瓴,确实如此。但目前似乎没有更高级的库,只能用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.*
这种速度很难达到理论极限。之前经过查找,我发现这类描述最好的一个现成crate是iceoryx2, 基于内存交互。
但实测发现,有时收不到,在Windows上的进展尚在开发中。
目前最后还是采用了共享内存,用nng交互文件名
【 在 eventvwr 的大作中提到: 】
: 试试zmq呢?
: 理论上本地回环测试,10G的网卡,传输速度能到8G+
--
FROM 123.127.159.*
几年前回环仍要走协议栈,有协议开销。
有时序要求,至少从A的角度看,每一帧都必须要计算,确保发出。从B的角度看,至少A能够B留出理论上充足的接收处理时间去应对每一帧。A-->光纤-->B倒是可以解决,但代价太大,放弃
【 在 VincentGe 的大作中提到: 】
: ...................
--
FROM 123.127.159.*
有道理,元信息确实可以某种程度省掉。
最多3路(1、2、3可选)生产者,1个消费者
目前我还是用了元信息,省了信号量,用相对低速IPC通道或Socket交互元信息,主要是考虑B端的如果偶尔一帧处理不实时(但平均是实时的),能保留上一个元信息不被覆盖,信号量感觉可能会覆盖。
【 在 xiaokang 的大作中提到: 】
: 没有元信息。不需要元信息。
: 一个简单的协议而已。最多把轻量级文件传输协议再简化一下。
: 定义一个数据结构=头部+数据载荷。
: ...................
--
FROM 123.127.159.*
非常感谢,代码级指导,很有启发!
很值得参考,看着像是AI生成的,但质量看着很高,这个AI有点厉害。
先写lib再写app的风格,实在要赞美
这几天我也改善了一下,因为我发现共享内存其实不存在Send和Sync的问题,是可以天然多线程处理的。所以现在我从图像流的源头(GPU输出),就直接创建共享内存,从GPU Buffer直接拷贝到SharedMemory (不再经过原本的Vec<u16>图像缓冲图),而后所有后续地方都用Arc<SharedMemory>传递。结构大致为
unsafe impl Send for SharedMemory {}
unsafe impl Sync for SharedMemory {}
pub struct SharedMemory {
handle: HANDLE,
mapping: MEMORY_MAPPED_VIEW_ADDRESS,
pub size: usize,
pub header_size: usize,
pub cursor: usize,
}
impl SharedMemory {
#[inline]
pub fn as_ptr(&self) -> *mut u8 {
self.mapping.Value as *mut u8
}
#[inline]
pub fn write(
&mut self,
data: &[u8],
) {
unsafe {
let ptr = self.as_ptr().add(self.cursor);
std::ptr::copy(data.as_ptr(), ptr, data.len());
self.cursor += data.len();
}
}
}
impl Drop for SharedMemory {
//
}
【 在 xiaokang 的大作中提到: 】
: 以下是基于 Rust 语言实现的生产者 - 消费者内存共享通信程序,特别处理了消费者验证数据归属的逻辑:
: rust-producer-consumer-ipc
: Rust版生产者-消费者内存共享通信程序
: ...................
--
FROM 123.127.159.*
你代码里的std:ptr::copy_nonoverlapping感觉更好,学习了,一会我就借鉴,谢谢
【 在 xiaokang 的大作中提到: 】
: 以下是基于 Rust 语言实现的生产者 - 消费者内存共享通信程序,特别处理了消费者验证数据归属的逻辑:
: rust-producer-consumer-ipc
: Rust版生产者-消费者内存共享通信程序
: ...................
--
FROM 123.127.159.*