Go读取文件n行的思路之旅

【问题】最近想在一个10G的文件上读取最后100行数据,用了多种方式去实现,发现还是逆向读取比较香一点
【方法】分别尝试了两种方式:双端队列和逆读文件
  在这里我就直接把结论放在文章前面

  • 双端队列:适用于文件数据不大的情况,效率会达到最高
  • 逆读文件:适用于大文件,会有不俗的读取速率,内存占用也不高

开始前,先亮一下【读取文件正常操作】

path := "/www/" + siteName + ".log"
num := 100
data := make([]string, 0, num)file, err := os.Open(path)
if err != nil {return data
}
defer file.Close()
// 顺读日志信息
scanner := bufio.NewScanner(file)
for scanner.Scan() && len(data) < num {data = append(data, scanner.Text())
}if err := scanner.Err(); err != nil {fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
return data

一、双端队列实现读取100行数据

data1 := list.New()
scanner := bufio.NewScanner(file)
for scanner.Scan() {// 将新的行添加到队列的末尾data1.PushBack(scanner.Text())// 如果队列的大小超过100,从队列的头部移除元素if data1.Len() > num {e := data1.Front()data1.Remove(e)}
}if err := scanner.Err(); err != nil {fmt.Fprintln(os.Stderr, "reading standard input:", err)
}// 将队列转换为切片
res := make([]string, 0, num)
for e := data1.Front(); e != nil; e = e.Next() {res = append(res, e.Value.(string))
}return res

二、逆向读取

  使用文件指针,从文件的末尾开始读取。我们可以使用os包的Seek函数来定位文件的末尾,然后逐行向上读取,直到读取到100行。

stats, statsErr := file.Stat()
if statsErr != nil {return nil
}size := stats.Size()
lines := make([]string, 0, num)
buf := make([]byte, size)for {readSize, err := file.ReadAt(buf, size-int64(len(buf)))if err != nil && err != io.EOF {break}size -= int64(readSize)for i := readSize - 1; i >= 0; i-- {if buf[i] == '\n' {lines = append(lines, string(buf[i+1:readSize]))readSize = iif len(lines) == num {return lines}}}if size == 0 {lines = append(lines, string(buf[:readSize]))break}if len(lines) >= num {break}if size < int64(len(buf)) {buf = make([]byte, size)}
}return lines

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发笔记

微信小程序开发笔记 1 微信小程序的项目结构 2 页面组成 一个微信小程序是由一个或多个页面组成的&#xff0c;这些页面被存放在pages目录中。下面以pages 目录下的index页面为例展示其组成部分&#xff0c;index页面的组成部分如下图所示。 由上图可知&#xff0c;index页面…

hbase-2.2.7分布式搭建

一、下载上传解压 1.在官网或者云镜像网站下载jar包 华为云镜像站&#xff1a;Index of apache-local/hbase/2.2.7 2.上传到linux并解压 tar -zxvf hbase-2.2.7-bin.tar.gz -C /usr/locol/soft 二、配置环境变量 1. vim /etc/profile export HBASE_HOME/usr/local/soft/h…

教授 Avi Wigderson荣获2023年图灵奖

2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。 Avi Wigderson因其在计算复杂性理论、随机性与算法等领域的开创性贡…

【数据结构】二分查找

1.概念 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;它在一个有序数组中查找特定的元素。二分查找的工作原理是不断将数组分成两半&#xff0c;比较中间元素与目标值&#xff0c;根据比较结果选择左半部分或右半部分继续查找&#xff0c;直…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 超文本&#xff1a;暂且理解为“超级的文本”&…

【opencv】dnn示例-segmentation.cpp 通过深度学习模型对图像进行实时语义分割

模型下载地址&#xff1a; http://dl.caffe.berkeleyvision.org/ 配置文件下载&#xff1a; https://github.com/opencv/opencv_extra/tree/4.x/testdata/dnn 该段代码是一个利用深度学习进行语义分割的OpenCV应用实例。下面将详细解释代码的功能和方法。 引入库 引入了一些必要…

PyTorch转ScriptModule的问题记录

文章目录 本文记录了转ScriptModule时遇到的一系列问题如何转ScriptModule?遇到的坑Expected a value of type Tensor for argument self but instead found type Optional[Tensor].Expected integer literal for index but got a variable or non-integer. ModuleList/Sequen…

(最详细)关于List和Set的区别与应用

关于List与Set的区别 List和Set都继承自Collection接口&#xff1b; List接口的实现类有三个&#xff1a;LinkedList、ArrayList、Vector。Set接口的实现类有两个&#xff1a;HashSet(底层由HashMap实现)、LinkedHashSet。 在List中&#xff0c;List.add()是基于数组的形式来添…

内部类

一.概念 当一个事物内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么将这个内部的完整结构最好使用内部类。在Java中&#xff0c;可以将一个类定义在另一个类或者一个方法内部&#xff0c;前…

记录OCEAN报错信息和对应解决方案

记录OCEAN代码报错信息和对应我代码部分解决方案 Error fprintf/sprintf: format spec. incompatible with data - “Format is ‘GBW IS %e\n’, argument #1 is nil”使用gainBwProd()测得GBW返回值为nil&#xff0c;导致printf出错添加检测代码 if(GBW nil printf("GB…

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步&#xff0c;引入了可编程梯度信息&#xff08;PGI&#xff09;和通用高效层聚合网络&#xff08;GELAN&#xff09;等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进&#xff0c;在MS COCO数…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

设计模式学习笔记 - 开源实战二(上):从Unix开源开发学习应对大型复杂项目开发

概述 软件开发的难度无外部两点&#xff0c;一是技术男&#xff0c;代码量不一定多&#xff0c;但要解决的问题比较难&#xff0c;需要用到一些比较深的技术解决方案或者算法&#xff0c;不是靠 “堆人” 就能搞定的&#xff0c;比如自动驾驶、图像识别、高性能消息队列等&…

【详细的Kylin使用心得】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

2024-03-23青少年软件编程(Python语言)等考(二级)解析

2024-03-23青少年软件编程(Python语言)等考(二级)解析一、单选题(共25题,共50分) 1.期末考试结束了,全班的语文成绩都储存在列表score中,班主任老师请小明找到全班最高分,小明准备用Python来完成,以下哪个选项,可以获取最高分呢?( B ) A. min(score) B. max(score…

超级USB设备工具箱V2.0 绿色版-供大家学习研究参考

1、芯片精灵 ChipGenius V3.01 2、惠普U盘格式化工具 V2.2.0 3、MFormat V1.00中文版 4、MyDisk V2.50 5、安全移除USB磁盘&#xff08;Disk Ejector&#xff09; 6、U盘烧录修复工具&#xff08;PortFree Production Program&#xff09; V3.38 7、护U使者 V1.28 8、闪存精灵2…

【缺啥补啥】图表征学习-1

图表征学习&#xff1a; 学习图中的元素&#xff0c;如节点、边、子图或整个图的向量表征&#xff0c;并应用基于向量的机器学习算法进行图数据的建模和分析 动态环境&#xff1a; 图数据包括结构、特征、性质、任务等&#xff0c;随时间发生变化 开放环境&#xff1a; 泛指数据…

《Effective C++》《资源管理——13、以对象管理资源》

文章目录 1、Terms13:Use objects to manage resources1.1、普通指针进行资源管理存在的问题1.2、RALL1.3、没有针对“动态分配数组”而设计的智能指针 2、面试相关2.1 解释RAII原则&#xff0c;并给出它在资源管理中的重要性。举出一个可以编译的例子2.2 描述一个你曾经使用RA…