首页 > 解决方案 > 如何在 C# 和 Python 进程之间共享字节数组的内存

问题描述

我有一个 C# 应用程序,它将持续为存储在字节数组中的数据分配内存。我有另一个用 python 编写的进程,一旦实例化,它将从这些数组中读取。这两个进程都将在 ubuntu 机器上运行。

显而易见的解决方案似乎是通过将指针从 C# 进程传递给 python 进程来在进程之间共享内存。然而,事实证明这很困难。

我主要看网上提出的解决方案。两个值得注意的是命名管道和映射内存文件。我阅读了以下帖子:

在 C 和 Python 之间共享内存。建议通过命名管道完成: Share memory between C/C++ and Python

C# 应用程序既不会从数组中读取也不会写入,python 脚本只会从数组中读取。因此,这个解决方案不能满足我的效率要求,而且当数据字面上存储在内存中时,它似乎是一个多余的解决方案。

当我查看内存映射文件时,似乎我们会为这些内存文件分配内存以将数据写入。但是,在使用映射文件之前,数据已经被分配。因此,它似乎也效率低下。

第二个帖子: https ://docs.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files?redirectedfrom=MSDN

文章说:“从 .NET Framework 4 开始,您可以使用托管代码访问内存映射文件,就像本机 Windows 函数访问内存映射文件一样”。ubuntu 机器在以与 windows 相同的方式读取这些文件时会遇到潜在问题吗?如果没有,有人可以举一个简单的例子,在上面提到的程序语言之间使用这些映射文件,并在进程之间传递对这些映射文件的引用,或者给出某人已经这样做的参考?

或者,如果有人知道如何将指向字节数组的指针从 C# 直接传递给 python,如果可能的话,那就更好了。

任何帮助是极大的赞赏!

标签: c#pythonarraysshared-memory

解决方案


所以四个月后回到这个帖子后,我没有找到满足我效率需求的解决方案。

我试图找到一种方法来避免将大量已分配在内存中的数据写入另一个进程。这意味着我需要重新分配相同的数据,占用双倍的内存并增加额外的开销,即使数据是读取安全的。然而,似乎解决这个问题的正确方法,在这种情况下,对于在同一台机器上运行的两个进程来说,使用命名管道是因为它们比即套接字更快。正如 Holger 所说,这最终成为了一个进程间通信的问题。

我最终用 python 编写了整个应用程序,无论如何它最终恰好是更好的选择,可能让我省了很多麻烦。


推荐阅读