【问题标题】:binary serialization/deserialization (BinaryFormatter) in Parallel.ForEachParallel.ForEach 中的二进制序列化/反序列化 (BinaryFormatter)
【发布时间】:2013-02-21 10:31:11
【问题描述】:

也许这是一个重复((但我没有找到任何在 Parallel.Foreach 中使用 binnaryformatter 的示例代码。有人可以提供它的示例吗? 代码示例

Parralel.ForEach(files, fileCurr=>
                  {
                      using(lib.Accesser("fileType", fileNameSpec))
                      {
                        LoadFileData(fileNameSpec,fileCurr,cancellationToken, progressCallback);
                      }
                   });
and

LoadFileData(fileNameSpec,fileCurr,cancellationToken, progressCallback)
{
 using(lib2.load(fileCurr.name))
{
 foreach(var v in fileCurr.include)
 {
   var objectForSerialization = loadObj(v);
   //my code goes below
   System.IO.Stream stream = System.IO.File.Open("J:\\volume", FileMode.OpenOrCreate);
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bformatter = new BinaryFormatter();
                    bformatter.Serialize(stream, objectForSerialization);
                    stream.Close();
  //but this fil will be locked by multyply writes

 }
}
}

【问题讨论】:

  • 您的序列化和/或反序列化在并行处理中会有问题吗?例如,它是否取决于同一处理队列中的其他对象的属性?你试过什么?我们可以看看一些示例代码吗?
  • 问题出在哪里?有什么例外吗?只需将序列化代码放入类似 serialize(xx) 的 Methode 中,然后从并行搜索中调用 thius。只要确保他们不共享任何资源
  • multiply writes in file((我需要一个简单的示例如何sincronize读取和写入

标签: c# parallel-processing


【解决方案1】:

你的问题的一部分是

在同一个文件中并行读取和写入或执行多个写入实际上是不可能的。

一旦为文件读/写实现了锁定机制,就不再需要并行执行迭代,因为它的操作不能并行执行。

如果您只是反序列化,(只是从文件中读取)那就另当别论了。

只读访问可以并行完成,因为它不需要单独锁定文件。

见:How can I read a text file without locking it?

您可以做的另一件事是预加载文本文件(如果可能的话)并直接从结果字符串中反序列化它们。

::编辑::

还有一件事:

您似乎总是在写入 J: 驱动器上的同一个文件(一个名为 volume 的文件,没有扩展名)。

如果您要序列化多个对象,您会希望将它们序列化为不同的文件...

如果您可以确保所有对象都被序列化为不同的文件,那么您可以使操作并行。

大概是这样的:

 System.IO.Stream stream = System.IO.File.Open("J:\\volume\\" + GenerateFileName(v), FileMode.OpenOrCreate);

然后确保 GenerateFileName 生成一个唯一的文件名作为字符串。

【讨论】:

  • 感谢蒂莫西先生的明确答复。问题是这个对象“objectForSerialization”只在这个地方创建((并且它没有传递给其他函数。你怎么看 - 在我的情况下序列化这个对象是可能的吗?
  • 这对我来说很难说,因为我看不出objectForSerialization 是什么类型,或者loadObj(v) 中到底发生了什么
  • 我确实注意到了一件事,请查看更新后的答案
  • 哦,只是“蒂姆”很好:P
  • 我是这个项目的新手,所以我只是迈出了第一步,但是 - objectForSerialization 是一个非常大的类,具有许多 guid、字符串等字段 - 没关系。对于 ManualResetEvent 或 SemaphoreSlim 等字段,我使用 [NonSerialized()]。 loadObj(v) - 据我了解,它只是一个“构造函数” - 它创建此 objectForSerialization 的新实例,并使用来自传入“v”的值设置它的字段,据我所知,一些值由默认值初始化。但我只是想在二进制文件中序列化这个对象
猜你喜欢
  • 2014-01-04
  • 2012-08-12
  • 1970-01-01
  • 2011-06-08
  • 2014-12-10
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多