有没有人知道是否可以直接从套接字读取内存映射的.NET文件中的某个位置?这恰好是一个非持久性内存映射文件(纯粹在内存中,没有相关的磁盘文件),如果有帮助的话。
上下文:我正在尝试在我有大型内存映射对象在分布式系统中从一个节点移动到另一个节点的情况下实现最小复制代码。我正在通过标准套接字库使用UDP,所以我希望能够从套接字(我在Infiniband网络上,因此MTU可能非常大)上读取64KB到一个偏移的位置进入内存映射区域。
到目前为止,我所发现的一切似乎都涉及进行复制操作 - 首先读取我的数据,然后将其复制到内存映射文件中。这就是我想要避免的:复制操作。实际上我有相同的发送问题:我想直接从内存映射文件发送。
虽然复制可能看起来很小,但我正在使用的对象是巨大的(云场景):大量的数GB内存映射对象,我想将其视为字节数组。所以那些额外的复制操作对我来说可能很昂贵。事实上,我的真正目标是使用Infiniband动词并将机器A上的内存映射区域直接DMA传输到机器B上的内存映射区域,完全绕过UDP。
任何指针都会非常感激!
(更多细节:这些是大型集群,64位计算机上的应用程序,虽然我的代码是用C#编写的.NET,但创建这些内存映射对象的应用程序主要是用C ++或其他语言编写的 - 想想例如,它们作为Hadoop或Mapreduce任务,以及作为巨大图像或连接网页的文件,这样的东西。所以那些应用程序生成这些文件 - 可能从Map步骤输出 - 现在它们需要被“洗牌” “到了正确的地方。这是我要做的具体事情......理想情况下我的代码仍然存在于.NET / C#中,仅仅因为我喜欢.NET中的C#。我使用Mono for Linux进行交叉编译。 ..这实际上是他们在这些集群上运行的东西)
答案 0 :(得分:0)
显然Keith值得称赞我指的是正确的方向,但总结一下答案:最适合我的是用C或C ++编写一个小模块,编译它来创建一个DLL,它将成为我的一部分装配,并加载它(这可以动态或静态完成;后者当然更容易)。然后,我可以从C#调用C,我的C代码可以使用真实地址进行原始系统调用。由于内存映射文件(即使没有持久存储的文件)由于垃圾收集或整合而不会移动,因此这是一个非常简单的情况。事实上,C代码甚至不需要从C#代码中学习地址 - 它只能“重新映射”同一个文件,尽管传递地址应该很容易。而且,当你接下来的时候,这可以像我原来的C#代码一样便携。
相比之下,如果没有辅助程序或两个程序,这将是一个真正的痛苦。
基思,如果你想以你的名义重新发布这个,我会删除我的摘要并“投票”到顶部(你确实应得分......)