【问题标题】:Is it possible to avoid serialization/deserialization and to share big memory object with Memory-mapped files (MMF)?是否可以避免序列化/反序列化并与内存映射文件 (MMF) 共享大内存对象?
【发布时间】:2014-11-19 20:11:40
【问题描述】:

我需要将一个 C# 内存对象从一个进程传递到另一个 (IPC)

我刚刚尝试在文件中序列化这个对象,然后在我的第二个进程中使用二进制序列化 (BinaryFormatter) 反序列化它,以获得良好的性能。

很遗憾,性能没有达到我的预期。 由于我的对象有很多信息,序列化和反序列化花费的时间太多(我的对象的序列化在我的硬盘驱动器上占用了 1MB 以上)。

听说过

内存映射文件 (MMF)

当进程之间共享的对象很简单时,这似乎是 IPC 最快的方法之一。 What is the fastest and easiest way to communicate between 2 processes in C#?

我的对象只是像这样的简单嵌套结构:

public struct Library
{
    public Book[] books;
    public string name;
}

public struct Book
{
    public decimal price;
    public string title;
    public string author;
}

=> 是否可以避免序列化/反序列化并与MMF共享这种对象?

=> 共享对象应该具备哪些特点才能避免这些序列化/反序列化操作?

还有一个约束: 我的第一个进程是 C# 64 位进程,我的第二个进程是 32 位进程。

谢谢

【问题讨论】:

  • 你需要衡量你大部分时间都在哪里度过。请注意,磁盘 I/O 默认情况下是缓存的,因此很有可能大部分时间花在序列化而不是 I/O 本身上(因为无论如何它都将在内存中操作,除非您的系统承受沉重的内存压力)。
  • @AlexeiLevenkov:我同意你的看法。大部分时间花在序列化/反序列化上,而不是 I/O 本身
  • 你是如何序列化对象的?
  • @SriramSakthivel:使用 BinaryFormatter
  • Check this out 尝试使用 Marshal 类。

标签: c# struct ipc 32bit-64bit memory-mapped-files


【解决方案1】:

您不能使用 C# 直接在内存映射文件中分配对象(保持安全代码)。因此,这意味着您需要进行某种序列化才能在两个应用程序之间传输数据。

广泛的选择:

  1. 将所有原始数据(或多或少作为字节数组)保留在 MMF 中,并使用 C# 包装器按需读取/写入数据。
  2. 手动查找更快的序列化/构建
  3. 使用某种形式的更改跟踪并仅发送应用程序之间的差异。

我个人会选择选项 3,因为如果适用于特定问题,它将提供最可靠和类型安全的收益。

【讨论】:

  • 是否有任何人知道的博客文章或文章会特别展示与 MMF 和二进制序列化相关的内容?如果有一天有人遇到这个 - 粘贴在这里!
【解决方案2】:

是否可以避免序列化/反序列化并分享这个 具有 MMF 的对象类型?

使用var/foreach 语句迭代Book[] 项目的元素,并通过创建视图访问器将它们写入MMF。

例子:

 var BookWriter = (whatever you named Book[]);


Foreach(var in BookWriter)

{

(Using MMF...))
    {  
        (Using Accessor.MMF...))
        {      
        Accessor.write(point1, Bookwriter[0]);
        Accessor.write(point2, Bookwriter[1]);
         }//dispose ViewAcessor.
    }// disposes the MMF handle...`

}// Finished iterating Book[i]...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2012-01-12
    • 2011-05-13
    • 1970-01-01
    • 2011-01-16
    • 2016-07-12
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多