Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 管理大型iStream的正确方法是什么?_C#_Com_Interop_Stream - Fatal编程技术网

C# 管理大型iStream的正确方法是什么?

C# 管理大型iStream的正确方法是什么?,c#,com,interop,stream,C#,Com,Interop,Stream,我正在编写一个C#类库,使用IStream通过COM自动化传输大量数据。它使用API调用来创建流,并使用其中的方法来处理流 我的问题是,在传输大量数据时,控制内存占用的最佳方法是什么?将100MB+的文件数据加载到内存中似乎是浪费,客户端应用程序需要等到该过程完成后才能下载任何内容 我的计划是创建一个大小合理的流并多次写入。在写入下一个数据块之前,请返回到开头并覆盖从开头开始的内容。我这样做对吗?有没有更好的方法来解决这个问题?对于大量数据的临时本地存储,内存映射文件通常是个好主意。它将内存管理

我正在编写一个C#类库,使用IStream通过COM自动化传输大量数据。它使用API调用来创建流,并使用其中的方法来处理流

我的问题是,在传输大量数据时,控制内存占用的最佳方法是什么?将100MB+的文件数据加载到内存中似乎是浪费,客户端应用程序需要等到该过程完成后才能下载任何内容


我的计划是创建一个大小合理的流并多次写入。在写入下一个数据块之前,请返回到开头并覆盖从开头开始的内容。我这样做对吗?有没有更好的方法来解决这个问题?

对于大量数据的临时本地存储,内存映射文件通常是个好主意。它将内存管理的责任移交给了最了解如何做的Windows。如果不指定文件,它将映射到分页文件,除非必要,否则永远不会转到物理磁盘


如果您使用的是.NET 4.0,则会得到一个到内存映射文件的文件。

每个流实现都在缓冲区上实现。大多数情况下,您将100%控制缓冲区大小。您可以调整缓冲区大小以调整性能与内存使用平衡。如果您不同时打开数百条流,我建议尽量大的流大小:

var readStream=new System.IO.File.OpenRead(sourceFilePath); var writeStream=new System.Io.File.Create(destinationFile)

byte[]buffer=新字节[bufferSize]; int readLength; 而((readLength=readStream.Read(0,0,bufferSize)>0) {
writeStream.Write(缓冲区,0,readLength); }

writeStream.Close(); readStream.Close()


考虑使用属性file_ATTRIBUTE_TEMPORARY和file_FLAG_DELETE_ON_CLOSE创建的文件。把你的东西写进去。除非内存耗尽,否则Windows将尝试将其保留在磁盘缓存中。当您关闭句柄或程序终止(或崩溃!)时,它将自毁。我了解到了这一点。

< P>在使用Windows Cuffic Foundation(WCF)发送大消息时,经常需要限制用于缓冲这些消息的内存量。一种可能的解决方案是流式传输消息体(假设大部分数据在消息体中)。但是,有些协议需要对整个消息进行缓冲。可靠的消息传递和安全性就是这样的两个例子

另一种可能的解决方案是将大消息分成更小的消息块,一次发送一个消息块,然后在接收端重新构造大消息。应用程序本身可以执行分块和反分块,也可以使用自定义通道来执行。chunking channel示例显示了如何使用自定义协议或分层通道对任意大的消息进行分块和反分块

提供的示例可供下载

数据来自哪里?几乎不需要把所有的东西都存储在内存中。您当然可以在read()方法实现中从各种源(包括db表和文本文件)慢慢地读取它。库代码将数据解析为字节数组并将其传输到流。我可以写/读/写一小段,这不是问题。问题是,当我一直写到流的末尾时,它将不断增长,对吗?您可能最好编写自己的类来实现IStream接口,然后您可以处理对Read方法的调用并按需加载数据,一旦它被读取,就不再需要维护该数据了(假设您不允许搜索IStream)。这个问题是基于经验还是仅仅是担心发生不好的事情?我们有一个通过IStream在进程间传递数据的记录器。传输的数据比内存大(尽管不是您建议的比率)结果就是这样。我怀疑发送过程会一直阻塞,直到接收器接收到数据。我们从来没有真正抽出时间来问你的问题,因为它只是起作用了,没有人想问。为什么在C#picture中有COM自动化?是因为你有一些遗留组件可以与之交谈吗?