从文件超过10K的目录中读取文件
本文关键字:文件 读取 10K | 更新日期: 2023-09-27 17:50:09
我有一个目录有多个子目录,每个子目录有多个10K
xml文件。
当有1000个文件时,它通常读取5 secs
中的随机文件,而随着文件数的增加,它所读取的文件多于12 seconds
。
我使用下面的代码检索文件内容:-
if (File.Exists(xmlLogFilePath))
{
string retrivedText = File.ReadAllText(xmlLogFilePath);
}
谁能建议一下怎样才能提高性能?
。Net版本:2.0
可以使用并行异步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();
}
}
}
这里有几个方法可以考虑:
- 考虑到文件量大,将数据移动到数据库
- 如果这是不可能的,尝试升级你的硬盘到一个固态驱动器。
- 或者,您可以将文件分割到单独的磁盘上并并行读取。
减速是由两个不同的因素引起的。
首先,由于有更多的文件,它们将占用更多的空间。当您想要读取一个"随机"文件时,它在磁盘缓存中的概率会更低。这将增加读取文件的平均时间,并且除了可能增加计算机中的RAM数量之外,您无能为力。
其次,目录是需要搜索文件的数据结构。随着目录的增加,即随着目录中文件数量的增加,这将花费更长的时间。你可以这样做:确保你的目录更小。例如,为文件名以给定字符开头的所有文件创建一个目录。这将加快搜索速度。
我认为您在文件系统中查找文件记录浪费了时间。在上面的例子中,你做了两次:第一次是在Exists()调用中,第二次是在ReadAllText()中打开文件。也许,您可以使用FileInfo结构最小化文件目录访问。但是我更喜欢重新组织文件,这样一个目录中包含的文件不超过1000个。
按File实现。ReadAllText(字符串路径)它使用一个默认缓冲区大小为1024字节的StreamReader(至少在。net 4.5.1中-我不确定它是否已经改变)。但是,您可以通过使用更高的缓冲区大小来提高读取文件的性能,从而减少后台调用。