Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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# 内存有效的文件附加_C#_File_Merge_Memory Efficient - Fatal编程技术网

C# 内存有效的文件附加

C# 内存有效的文件附加,c#,file,merge,memory-efficient,C#,File,Merge,Memory Efficient,我有几个文件的内容需要合并成一个文件。我有下面的代码来实现这一点。。。但它在内存使用方面似乎相当低效。。。你能建议一个更好的方法吗 Util.MoveFile函数仅用于跨卷移动文件 } 有时候,调用shell函数比重新实现功能要好。正如Alan所说,您可以在unix系统或windows上使用CAT,也可以使用内置的命令处理器 copy file1+file2+file3 concated_file 有时候,调用shell函数比重新实现功能要好。正如Alan所说,您可以在unix系统或windo

我有几个文件的内容需要合并成一个文件。我有下面的代码来实现这一点。。。但它在内存使用方面似乎相当低效。。。你能建议一个更好的方法吗

Util.MoveFile函数仅用于跨卷移动文件

}


有时候,调用shell函数比重新实现功能要好。正如Alan所说,您可以在unix系统或windows上使用CAT,也可以使用内置的命令处理器

copy file1+file2+file3 concated_file

有时候,调用shell函数比重新实现功能要好。正如Alan所说,您可以在unix系统或windows上使用CAT,也可以使用内置的命令处理器

copy file1+file2+file3 concated_file

您可以使用较小的固定大小缓冲区,如下所示:

byte[] bytes = new byte[8192]; // adjust this as needed
int bytesRead;
do {
    bytesRead = fsIn.Read(bytes, 0, bytes.Length);
    fsOut.Write(bytes, 0, bytesRead);
} while (bytesRead > 0);
除了在最后一个块中,这是非常不言自明的,所以基本上发生的是我将一个8K字节数组传递给Read方法,该方法返回它实际读取的字节数。所以在写调用中,我传递的是介于0和8192之间的值。换句话说,在最后一个块上,即使我正在传递一个8192字节的字节数组,
bytesRead
可能只有10个字节,在这种情况下,只需要写入前10个字节

编辑


我编辑了我的答案,用了一种稍微不同的方式。我没有使用输入文件的位置来确定何时中断循环,而是检查bytesRead是否大于零。此方法适用于任何类型的流到流复制,包括没有固定或已知长度的流。

您可以使用较小的固定大小缓冲区,如:

byte[] bytes = new byte[8192]; // adjust this as needed
int bytesRead;
do {
    bytesRead = fsIn.Read(bytes, 0, bytes.Length);
    fsOut.Write(bytes, 0, bytesRead);
} while (bytesRead > 0);
除了在最后一个块中,这是非常不言自明的,所以基本上发生的是我将一个8K字节数组传递给Read方法,该方法返回它实际读取的字节数。所以在写调用中,我传递的是介于0和8192之间的值。换句话说,在最后一个块上,即使我正在传递一个8192字节的字节数组,
bytesRead
可能只有10个字节,在这种情况下,只需要写入前10个字节

编辑



我编辑了我的答案,用了一种稍微不同的方式。我没有使用输入文件的位置来确定何时中断循环,而是检查bytesRead是否大于零。此方法适用于任何类型的流到流复制,包括没有固定或已知长度的流。

请参阅:在C#中连接三个文件的最快方法是什么?为什么你觉得它效率低下?如果这些是文本文件,为什么不使用“cat?”@Alan-代码是在windows上运行的,所以没有“cat”@换生灵-我觉得它效率很低,因为它使用了大量的内存@Mitch Wheat-我正在查看代码,它只创建了一个缓冲区,而不是大量的新字节调用。。。这应该真的很有帮助:)您能使用while循环,一次只读取每个文件的1024字节吗?阅读整个文件有点太多了。也许你会看到:在C#中连接三个文件的最快方法是什么?为什么你觉得它效率低下?如果这些是文本文件,为什么不使用“cat?”@Alan-代码是在windows上运行的,所以没有“cat”@换生灵-我觉得它效率很低,因为它使用了大量的内存@Mitch Wheat-我正在查看代码,它只创建了一个缓冲区,而不是大量的新字节调用。。。这应该真的很有帮助:)您能使用while循环,一次只读取每个文件的1024字节吗?阅读整个文件有点太多了。谢谢Josh。。。我将实现这一点并分析结果请注意,与任何事情一样,性能和内存使用之间总是存在权衡。最快的方式就是你最初展示的方式。。。根据需要使用尽可能多的内存。还要注意,除非使用特定的构造函数,否则.NET完成的默认缓冲仍然会发生。文件系统仍将应用自己的写缓冲。但至少这可以让你在不担心OutOfMemoryException的情况下处理大文件。我会使用更大的缓冲区,比如1Mb的典型磁盘。对于非SSD磁盘,计算高效使用磁盘所需的缓冲区大小的信封背面方法是:将磁盘寻道时间乘以吞吐量。对于现代磁盘,您可以获得(~10ms)*(~100Mb/秒)=1MB。8KB可能会明显减慢速度。完全同意Michael的观点,一次压缩8K可能会导致瓶颈。我应该澄清一下,这只是一个示例数字,但最佳缓冲区大小将取决于一些因素,例如您一次将执行多少个缓冲区(是web服务器吗?)以及文件的平均大小。谢谢Josh。。。我将实现这一点并分析结果请注意,与任何事情一样,性能和内存使用之间总是存在权衡。最快的方式就是你最初展示的方式。。。根据需要使用尽可能多的内存。还要注意,除非使用特定的构造函数,否则.NET完成的默认缓冲仍然会发生。文件系统仍将应用自己的写缓冲。但至少这可以让你在不担心OutOfMemoryException的情况下处理大文件。我会使用更大的缓冲区,比如1Mb的典型磁盘。对于非SSD磁盘,计算高效使用磁盘所需的缓冲区大小的信封背面方法是:将磁盘寻道时间乘以吞吐量。对于现代磁盘,您可以获得(~10ms)*(~100Mb/秒)=1MB。8KB可能会明显减慢速度。完全同意Michael的观点,一次压缩8K可能会导致瓶颈。我应该澄清一下,这只是一个示例数字,但最佳缓冲区大小将取决于一些因素,例如您一次要执行的缓冲区数量(是web服务器吗?)和文件的平均大小。谢谢preet sangha。。。你也是对的。。。创建新的shell进程/线程会有开销,但最终它应该比我所能做的任何事情都更高效。。我将努力实施和改进