C#中的高效日志备份程序

时间:2011-07-08 17:15:54

标签: c# performance backup

我正在用C#编写日志备份程序。主要目标是从多个服务器获取日志,复制和压缩文件,然后将它们移动到中央数据存储服务器。我将不得不每24小时移动大约270Gb的数据。我有一个专用的服务器来运行这个作业和1Gbps的局域网。目前我正在从(文本)文件中读取行,将它们复制到缓冲流中并将它们写入目标。

我的上一次测试在28分钟内复制了大约2.5Gb的数据。这不行。我可能会为程序提高效率,但我正在寻找一种更好的方法来复制文件。

我还在尝试先压缩所有内容,然后使用流缓冲区进行复制。真的,我只是想从比我更有经验的人那里寻求一些建议。

感谢任何帮助,谢谢。

4 个答案:

答案 0 :(得分:1)

你首先需要描述Umair所说的内容,以便你可以弄清楚压缩与传输所花费的28分钟中有多少。还可以使用不同的压缩库测量压缩率(字节/秒),并将传输速率与其他程序(如Filezilla)进行比较,看看是否接近系统的最大带宽。

要考虑的一个好的库是DotNetZip,它允许您压缩到一个流,这对于大文件很方便。

一旦你对一个线程进行了微调,就可以试验几个线程并观察你的处理器利用率,看看最佳位置在哪里。

答案 1 :(得分:0)

尝试分析您的程序...瓶颈往往是您最不希望的地方。正如一些聪明人所说:“过早优化是万恶之源”。

在工作中遇到类似情况后,我被赋予了优化流程的任务。在分析之后,发现瓶颈被称为睡眠功能调用(用于线程之间的同步!!!!)。

答案 2 :(得分:0)

在源代码下压缩日志并使用TransmitFile(这是一个原生API - 不确定是否有相同的框架,或者P / Invoke这个是多么容易)将它们发送到目的地。 (可能{。{3}}在.Net中做同样的事情?)

无论如何,不​​要按行读取文件 - 读取块中的文件(循环执行FileStream.Read for 4K - 比如说 - 字节直到读取计数== 0)并将其直接发送到网络管道。 / p>

答案 3 :(得分:0)

其中一个解决方案就是你提到的:压缩文件在一个Zip文件中,然后通过网络传输。当你传输一个文件并且在文件传输期间经常出现主要瓶颈时,这将会更快,这是目的地安全检查。 因此,如果您使用一个zip文件,则应该进行一次检查。

简而言之:

  1. 压缩

  2. 转移

  3. 解压缩(如果需要)

  4. 这已经必须为您带来性能方面的巨大好处。