我有一个包含多个子目录的目录,每个子目录都有超过10K
个xml文件。
当有1000个文件时,它用于读取5 secs
中的随机文件,而文件计数增加则超过12 seconds
。
我使用以下代码来检索文件内容: -
if (File.Exists(xmlLogFilePath))
{
string retrivedText = File.ReadAllText(xmlLogFilePath);
}
有人可以建议可以采取哪些措施来提高绩效。
.Net版本:2.0
答案 0 :(得分:2)
您可以使用并行异步I / O方法:
以下示例通过编写10个文本文件来演示并行处理。
public async void ProcessWriteMult()
{
string folder = @"tempfolder\";
List<Task> tasks = new List<Task>();
List<FileStream> sourceStreams = new List<FileStream>();
try
{
for (int index = 1; index <= 10; index++)
{
string text = "In file " + index.ToString() + "\r\n";
string fileName = "thefile" + index.ToString("00") + ".txt";
string filePath = folder + fileName;
byte[] encodedText = Encoding.Unicode.GetBytes(text);
FileStream sourceStream = new FileStream(filePath,
FileMode.Append, FileAccess.Write, FileShare.None,
bufferSize: 4096, useAsync: true);
Task theTask = sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
sourceStreams.Add(sourceStream);
tasks.Add(theTask);
}
await Task.WhenAll(tasks);
}
finally
{
foreach (FileStream sourceStream in sourceStreams)
{
sourceStream.Close();
}
}
}
答案 1 :(得分:1)
减速是由两个不同的因素引起的。
首先,由于文件越多,它们总共会占用更多空间。因为你想阅读&#34;随机&#34;文件,它在磁盘缓存中的概率会降低。这将增加读取文件的平均时间,除了可能增加计算机中的RAM数量之外,您无法做很多事情。
其次,目录是需要搜索文件的数据结构。随着目录的增加,即随着目录中文件数量的增加,这将花费更长的时间。您可以使用:确保您的目录更小。例如,为所有文件名以给定字符开头的文件创建目录。这将加快搜索速度。
答案 2 :(得分:0)
以下几种方法可以考虑:
答案 3 :(得分:0)
我认为您在文件系统中搜索文件记录时浪费了时间。在上面的示例中,您执行了两次:首先是Exists()调用,第二次是在ReadAllText()中打开文件。也许,您可以使用FileInfo结构最小化文件目录访问。但我更喜欢重新组织文件,因此一个目录包含的文件不超过1000个。
答案 4 :(得分:0)
根据File.ReadAllText(String path)的实现,它使用StreamReader,默认缓冲区大小为1024字节(至少在.NET 4.5.1中 - 我不确定它是否已更改)。但是,您可以通过使用更高的缓冲区大小来提高读取文件的性能,从而减少后台调用。