我正在使用.NET编写一个简单的Web服务,一种方法是用来从客户端向服务器发送一个文件块,服务器打开一个临时文件并追加这个块。这些文件非常大,80Mb,网络IO似乎很好,但随着文件变大,附加写入本地文件的速度逐渐减慢。文件IO缓慢或缓存在Web服务中?
后续是减慢,服务器,å文件是一个字符串上运行的代码,ADATA是一个byte []
using (StreamWriter lStream = new StreamWriter(aFile, true))
{
BinaryWriter lWriter = new BinaryWriter(lStream.BaseStream);
lWriter.Write(aData);
}
调试这个过程中,我可以看到,在离开using语句是越来越慢。
如果我运行在一个简单的独立测试应用程序的代码的写操作每次都以相同的速度约3毫秒,请注意缓冲液(ADATA)总是相同的侧上,约0.5兆。
我已经尝试了各种不同的作家的实验,系统副本追加临时文件,所有在Web服务下运行时都放慢速度。
这是怎么发生的?我怀疑Web服务试图缓存对本地文件系统对象的访问权限,我如何关闭特定文件?
更多信息 -
如果我硬编码路径的速度是好的,像这样
using (StreamWriter lStream = new StreamWriter("c:\\test.dat", true))
{
BinaryWriter lWriter = new BinaryWriter(lStream.BaseStream);
lWriter.Write(aData);
}
但随后缓慢复制这个临时文件的最终文件目的地以后 -
File.Copy("c:\\test.dat", aFile);
如果我在路径中使用任何varibale,它会变慢,例如 -
using (StreamWriter lStream = new StreamWriter("c:\\test" + someVariable, true))
{
BinaryWriter lWriter = new BinaryWriter(lStream.BaseStream);
lWriter.Write(aData);
}
已经评论说,我不应该使用的StreamWriter,请注意我尝试使用的FileStream,其中没有当代码的Web服务下运行所做的任何改变许多方法来打开该文件,我想一直写等
它我甚至试过这种奇怪的事情 -
Write the data to file a.dat
Spawn system "cmd" "copy /b b.dat + a.dat b.dat"
Delete a.dat
这会减慢一样????
使我认为Web服务器运行在一些受保护的文件IO环境中捕获此过程和子进程中的所有文件操作,如果我生成的文件可能稍后会提供给客户端,我可以理解这一点,但是我我没有,我正在做的是在磁盘上存储大的二进制blob,并在索引/指针存储在数据库中,如果我注释写入文件,整个过程根本没有性能问题。
我开始阅读关于Web服务器缓存策略,让我觉得有一个web.config设置标记为未缓存的文件夹?或者我完全吠叫错了树。
你在什么下运行web服务? cassini或IIS?您的测试客户端是否使用相同路径与web服务在同一个系统上运行? – 2009-08-14 02:12:38
从VisualStudio运行,最终它将从卡西尼运行。我已经尝试在系统临时目录中找到临时文件,并在Web服务根目录下找到一个文件夹,无论如何,无论如何,都会发生同样的减速,看起来Web服务正在高速缓存对文件的访问。 – titanae 2009-08-14 02:50:02
我并不建议你停止使用'StreamWriter'作为性能改进。我建议这样做,因为如果你正在编写二进制数据,使用它就毫无意义。由于'BinaryWriter'已经在使用'BaseStream',所以性能不会提高。 – 2009-08-14 11:33:22