我正在用C#编写日志备份程序。主要目标是从多个服务器获取日志,复制和压缩文件,然后将它们移动到中央数据存储服务器。我将不得不每24小时移动大约270Gb的数据。我有一个专用的服务器来运行这个作业和1Gbps的局域网。目前我正在从(文本)文件中读取行,将它们复制到缓冲流中并将它们写入目标。
我的上一次测试在28分钟内复制了大约2.5Gb的数据。这不行。我可能会为程序提高效率,但我正在寻找一种更好的方法来复制文件。
我还在尝试先压缩所有内容,然后使用流缓冲区进行复制。真的,我只是想从比我更有经验的人那里寻求一些建议。
感谢任何帮助,谢谢。
答案 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文件,则应该进行一次检查。
简而言之:
压缩
转移
解压缩(如果需要)
这已经必须为您带来性能方面的巨大好处。