我有一些非常基本的遗留代码。代码从ZIP文件中提取文件,将ZIP中的文件内容从XML反序列化为对象,并对该对象执行某些操作。
Zip文件大约是90mb。问题在于,此代码在本地计算机上执行大约3秒(提取1.5秒,并在1.3秒内反序列化所有文件),但是当我在Windows服务器和IIS 6.1上发布该代码时,大约需要28秒与同一文件相同的操作。 14秒提取和13秒反序列化。
服务器是VPS,8核,16GB RAM。
有没有人有任何想法?
public List<FileNameStream> UnzipFilesTest(List<string> files, string zippedPathAndFile)
{
//var result = new Dictionary<string, MemoryStream>();
var unzipedFiles = new List<FileNameStream>();
string file1 = System.Web.Hosting.HostingEnvironment.MapPath(zippedPathAndFile);
if (File.Exists(file1))
{
using (MemoryStream data = new MemoryStream())
{
using (Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(file1))
{
zipFile.ParallelDeflateThreshold = -1;
foreach (ZipEntry e in zipFile)
{
if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase))
{
e.Extract(data);
unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data);
}
}
}
}
}
return unzipedFiles;
}
答案 0 :(得分:2)
使用Parallel.Foreach循环优化foreach循环将安排使用多个线程解压缩文件的工作。线程越多,它就越快。我并不是说它不是服务器上的硬件,网络,防火墙或防病毒问题 - 但是硬件问题并不是明智之举。
这可能是有用的MSDN Link。
您的代码看起来像:
Parallel.ForEach(zipEntires, (e) =>
{
if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase))
{
e.Extract(data);
unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data);
}
}
答案 1 :(得分:0)
这是VPS本身的一部分。经过7天的研究,主机提供商工作人员提出要迁移到新机器,现在一切似乎都井井有条。