从具有10K以上文件的目录中读取文件

时间:2014-03-14 08:25:10

标签: c# .net file

我有一个包含多个子目录的目录,每个子目录都有超过10K个xml文件。

当有1000个文件时,它用于读取5 secs中的随机文件,而文件计数增加则超过12 seconds

我使用以下代码来检索文件内容: -

 if (File.Exists(xmlLogFilePath))
 {      
      string retrivedText = File.ReadAllText(xmlLogFilePath);     
 } 

有人可以建议可以采取哪些措施来提高绩效。

.Net版本:2.0

5 个答案:

答案 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)

以下几种方法可以考虑:

  1. 考虑到大量文件,将数据移动到数据库中。
  2. 如果无法做到这一点,请尝试将硬盘升级为固态硬盘。
  3. 或者,您可以将文件拆分到单独的磁盘上并平行阅读。

答案 3 :(得分:0)

我认为您在文件系统中搜索文件记录时浪费了时间。在上面的示例中,您执行了两次:首先是Exists()调用,第二次是在ReadAllText()中打开文件。也许,您可以使用FileInfo结构最小化文件目录访问。但我更喜欢重新组织文件,因此一个目录包含的文件不超过1000个。

答案 4 :(得分:0)

根据File.ReadAllText(String path)的实现,它使用StreamReader,默认缓冲区大小为1024字节(至少在.NET 4.5.1中 - 我不确定它是否已更改)。但是,您可以通过使用更高的缓冲区大小来提高读取文件的性能,从而减少后台调用。