最有效的文件读取方式

Posted

技术标签:

【中文标题】最有效的文件读取方式【英文标题】:Most efficient way of reading file 【发布时间】:2012-03-02 02:13:00 【问题描述】:

我有一个文件,其中包含一定数量的具有一些数字的固定长度行。我需要读取每一行以获得该数字并处理它们并写入文件。 由于我需要读取每一行,随着行数的增加,它变得很耗时。

是否有读取文件每一行的有效方法?我正在使用 C#。

【问题讨论】:

你是4.0还是2/3.5? 【参考方案1】:

File.ReadLines (.NET 4.0+) 可能是最节省内存的方法。

它返回一个IEnumerable<string>,这意味着行将以流的方式被懒惰地读取。

以前的版本没有这种方式的流式传输选项,但是使用StreamReader逐行读取可以达到相同的效果。

【讨论】:

这仅在 .NET 4 或更高版本中可用。只是需要指出一点,不确定 OP 使用的是什么。 我很确定我在 3.5 中使用了它,可能是 File.ReadAllText 返回一个字符串数组【参考方案2】:

从文件中读取所有行总是至少 O(n)。当文件大小开始成为问题时,可能是考虑为信息创建数据库而不是平面文件的好时机。

【讨论】:

这些文件是外部硬件的结果,它将以文件的形式出现,实际上是大量文件......任何有效读取文件的方式都将不胜感激【参考方案3】:

不确定这是最有效的,但对我来说效果很好: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

    //Declare a new file and give it the path to your file
    FileInfo fi1 = new FileInfo(path);

    //Open the file and read the text
    using (StreamReader sr = fi1.OpenText()) 
    
        string s = "";
        // Loop through each line
        while ((s = sr.ReadLine()) != null) 
        
            //Here is where you handle your row in the file
            Console.WriteLine(s);
        
    

【讨论】:

在此之后我要做的不仅仅是将行写入控制台,而是将行转换为数组并将数据导入数据库表。似乎通过制表符分隔的文件运行得非常快,但我几乎不需要用它浏览超过几千条记录。 除非你用 StreamReader 做一些特别的事情,在这个例子中你不是,你可以写foreach(var line in File.ReadLines(path)) Console.WriteLine(line); 【参考方案4】:

无论您使用哪种操作系统,在您的代码和实际存储机制之间都会有好几层。硬盘驱动器和磁带驱动器以块的形式存储文件,如今每个块通常约为 4K。如果您想读取一个字节,设备仍会将整个块读取到内存中——这样会更快。设备和操作系统也可以各自保存一个块缓存。因此,您无法更改标准(高度优化的)文件读取行为;只需根据需要读取文件,其余的交给系统处理即可。

如果处理文件的时间成为问题,有两个选项可能会有所帮助:

    尝试安排使用较短的文件。听起来您正在处理日志文件或其他东西 - 更频繁地运行程序可能有助于至少表现出更好的性能。

    更改数据的存储方式。同样,我知道该文件来自某些外部来源,但也许您可以安排运行定期将原始文件转换为您可以更快阅读的文件的作业。

祝你好运。

【讨论】:

以上是关于最有效的文件读取方式的主要内容,如果未能解决你的问题,请参考以下文章

从 .txt 文件中读取未知大小的整数二维数组的最有效方法是啥?

如何从节点中的ReadStream同步读取

有没有一种最有效的方法来读取/写入C#中的10GB二进制文件?

在 Python 中读取大量 json 文件?

读取文件时宏定义的有效方法?

在 c# 中有效地读取 .csv 文件? [关闭]