如何在 C# 和 Python 进程之间共享字节数组的内存
How to share memory of a byte array between a C# and Python processes
我有一个 C# 应用程序,它将不断为存储在字节数组中的数据分配内存。我有另一个用 python 编写的进程,一旦实例化就会从这些数组中读取。这两个进程都将在 ubuntu 机器上 运行ning。
显而易见的解决方案似乎是通过将指针从 C# 进程传递到 python 进程来在进程之间共享内存。然而,事实证明这很困难。
我主要看了网上提出的解决方案。两个值得注意的是命名管道和映射内存文件。我阅读了以下 posts:
在 C 和 Python 之间共享内存。建议通过命名管道完成:
C# 应用程序既不会读取数组也不会写入数组,python 脚本只会读取数组。因此,这个方案并不能满足我的效率要求,当数据字面上存储在内存中时,似乎是一个多余的方案。
当我查看内存映射文件时,似乎我们会为这些内存文件分配内存以写入数据。但是,在使用映射文件之前已经分配了数据。因此,它似乎也很低效。
第二个post:
https://docs.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files?redirectedfrom=MSDN
文章说:"Starting with the .NET Framework 4, you can use managed code to access memory-mapped files in the same way that native Windows functions access memory-mapped files"。 ubuntu 机器 运行 在以与 windows 相同的方式读取这些文件时会遇到潜在问题吗?如果没有,有人可以给出一个简单的例子,在上面提到的程序语言之间使用这些映射文件,并在进程之间传递对这些映射文件的引用,或者给出某人已经这样做的地方的引用?
或者,如果有人知道如何将指向字节数组的指针从 C# 直接传递给 python,那会更好。
非常感谢任何帮助!
所以在四个月后回到这个 post 之后,我没有找到满足我效率需求的解决方案。
我曾试图找到一种方法来解决必须将已分配在内存中的大量数据写入另一个进程的问题。这意味着我需要重新分配相同的数据,占用双倍的内存量并增加额外的开销,即使数据是读取安全的。然而,似乎解决这个问题的正确方法,在这种情况下,对于同一台机器上的两个进程 运行 来说,使用命名管道是因为它们比套接字更快。正如 Holger 所说,这最终成为进程间通信的问题。
我最终在 python 中编写了整个应用程序,这恰好是最终更好的选择,可能让我省去了很多麻烦。
我有一个 C# 应用程序,它将不断为存储在字节数组中的数据分配内存。我有另一个用 python 编写的进程,一旦实例化就会从这些数组中读取。这两个进程都将在 ubuntu 机器上 运行ning。
显而易见的解决方案似乎是通过将指针从 C# 进程传递到 python 进程来在进程之间共享内存。然而,事实证明这很困难。
我主要看了网上提出的解决方案。两个值得注意的是命名管道和映射内存文件。我阅读了以下 posts:
在 C 和 Python 之间共享内存。建议通过命名管道完成:
C# 应用程序既不会读取数组也不会写入数组,python 脚本只会读取数组。因此,这个方案并不能满足我的效率要求,当数据字面上存储在内存中时,似乎是一个多余的方案。
当我查看内存映射文件时,似乎我们会为这些内存文件分配内存以写入数据。但是,在使用映射文件之前已经分配了数据。因此,它似乎也很低效。
第二个post: https://docs.microsoft.com/en-us/dotnet/standard/io/memory-mapped-files?redirectedfrom=MSDN
文章说:"Starting with the .NET Framework 4, you can use managed code to access memory-mapped files in the same way that native Windows functions access memory-mapped files"。 ubuntu 机器 运行 在以与 windows 相同的方式读取这些文件时会遇到潜在问题吗?如果没有,有人可以给出一个简单的例子,在上面提到的程序语言之间使用这些映射文件,并在进程之间传递对这些映射文件的引用,或者给出某人已经这样做的地方的引用?
或者,如果有人知道如何将指向字节数组的指针从 C# 直接传递给 python,那会更好。
非常感谢任何帮助!
所以在四个月后回到这个 post 之后,我没有找到满足我效率需求的解决方案。
我曾试图找到一种方法来解决必须将已分配在内存中的大量数据写入另一个进程的问题。这意味着我需要重新分配相同的数据,占用双倍的内存量并增加额外的开销,即使数据是读取安全的。然而,似乎解决这个问题的正确方法,在这种情况下,对于同一台机器上的两个进程 运行 来说,使用命名管道是因为它们比套接字更快。正如 Holger 所说,这最终成为进程间通信的问题。
我最终在 python 中编写了整个应用程序,这恰好是最终更好的选择,可能让我省去了很多麻烦。