首页 > 后端开发 > C++ > 如何有效地从非常大的文本文件中检索最后 10 行?

如何有效地从非常大的文本文件中检索最后 10 行?

Barbara Streisand
发布: 2024-12-29 10:20:11
原创
245 人浏览过

How Can I Efficiently Retrieve the Last 10 Lines from a Very Large Text File?

从海量文本文件中高效检索最后 10 行

确定从超大文本中提取最后 10 行的最有效方法文件(超过 10GB)需要一种最小化计算的策略

利用文件定位和反向查找

推荐的方法是使用 Seek() 方法导航到文件末尾,并在文件中逐渐向后移动。文件直到遇到 10 个换行符。通过维护行计数,该方法可以识别向前读取并检索所需行的精确起点。此策略可以有效地处理具有不同行数的文件,包括少于 10 行的文件。

C# 中的实现示例

以下 C# 代码演示了上述方法,概括为定位文件中通过编码编码并用分隔符分隔的最后一个 numberOfTokens tokenSeparator:

public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) {
    int sizeOfChar = encoding.GetByteCount("\n");
    byte[] buffer = encoding.GetBytes(tokenSeparator);
    
    using (FileStream fs = new FileStream(path, FileMode.Open)) {
        Int64 tokenCount = 0;
        Int64 endPosition = fs.Length / sizeOfChar;

        for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) {
            fs.Seek(-position, SeekOrigin.End);
            fs.Read(buffer, 0, buffer.Length);

            if (encoding.GetString(buffer) == tokenSeparator) {
                tokenCount++;
                if (tokenCount == numberOfTokens) {
                    byte[] returnBuffer = new byte[fs.Length - fs.Position];
                    fs.Read(returnBuffer, 0, returnBuffer.Length);
                    return encoding.GetString(returnBuffer);
                }
            }
        }

        // handle case where number of tokens in file is less than numberOfTokens
        fs.Seek(0, SeekOrigin.Begin);
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        return encoding.GetString(buffer);
    }
}
登录后复制

通过利用此技术,可以以最小的内存使用量和计算复杂性从大型文本文件中检索最后 10 行,为这种常见的文件处理场景提供了有效的解决方案。

以上是如何有效地从非常大的文本文件中检索最后 10 行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板