c语言再大文件内搜索,C语言中大型磁盘文件的二进制搜索
这个问题经常在StackOverflow上重复出现,但我已经阅读了所有以前的相关答案,并对问题略有不同.
我有一个包含4.75亿行相同大小的23Gb文件,每行包含一个40个字符的哈希码,后跟一个标识符(一个整数).
我有一个传入的哈希码流 – 总共有数十亿个 – 对于每个传入的哈希码,我需要找到它并打印出相应的标识符.这项工作虽然很大,但只需要完成一次.
该文件太大,我无法读入内存,因此我一直尝试以下列方式使用map:
codes = (char *) mmap(0,statbuf.st_size,PROT_READ,MAP_SHARED,codefile,0);
然后我只是根据代码中的地址使用地址算法进行二进制搜索.
这似乎开始工作得很漂亮,并在几秒内产生几百万个标识符,使用100%的cpu,但是经过一些看似随机的时间,它会减慢到爬行的速度.当我使用ps查看进程时,它已使用100%的cpu从状态“R”更改为使用1%cpu的状态“D”(磁盘绑定).
这是不可重复的 – 我可以在相同的数据上再次启动该过程,并且可能在“慢速爬行”发生之前运行5秒或10秒.昨晚一次,在此之前我差不多花了一分钟.
一切都是只读的,我没有尝试任何写入文件,我已经停止了机器上的所有其他进程(我控制).它是一台现代的Red Hat Enterprise Linux 64位机器.
有谁知道为什么这个过程变得磁盘受限以及如何阻止它?
更新:
感谢大家的回答,以及您的想法;之前我没有尝试过所有各种改进,因为我想知道我是否以某种方式错误地使用了mmap.但答案的要点似乎是,除非我能将所有东西都挤进记忆中,否则我将不可避免地遇到问题.所以我将哈希码的大小压缩到没有创建任何重复项的前导前缀的大小 – 前15个字符就足够了.然后我将生成的文件拉入内存,并分别运行大约20亿个传入的哈希码.
c语言再大文件内搜索,C语言中大型磁盘文件的二进制搜索相关推荐
- 微信文件过大不能上传?学会这几种方法,再大文件也能轻松发
微信文件过大不能上传?学会这几种方法,再大文件也能轻松发 微信已经逐渐成为办公必须,但微信不支持大文件的发送,那么遇到这种情况,很多小伙伴都会选择用QQ,其实微信也能发送大文件,只要方法用对,下面就来 ...
- 大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)
从OpenSSL库中分离算法-MD5算法-大文件MD5计算 续上述博客 小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据 ...
- Java中没有递归的二进制搜索–迭代算法
本周的任务是用Java实现二进制搜索 ,您需要编写迭代和递归二进制搜索算法 . 在计算机科学中,二进制搜索或半间隔搜索是一种分而治之的算法,用于定位项目在排序数组中的位置. 二进制搜索通过将输入值与数 ...
- C语言再学习 -- 文件
文件是什么 一个文件(file)通常就是磁盘上的一段命名的存储区.C 将文件看成是连续的字节序列,其中每一个字节都可以单独地读取. 二进制和文本模式 1.在windows系统中,文本模式下,文件以&q ...
- C语言读取大文件的问题 内存映射
2019独角兽企业重金招聘Python工程师标准>>> [Ref] Windows对文件的读写提供了很丰富的操作手段,如: 1. FILE *fp, fstearm...; (C/C ...
- R语言对大文件excel按行分解。
目前百度搜索R语言拆分文件数据框可以获取非常多的教程,但是大多数基于某一列进行分类输出,该拆分方法在杂乱数据拆分应用上不具有较好的实用性. 在这里我以一百万条数据为例进行示范按行数拆分. 结果如下:
- c语言ofstream头文件,【c++】c++中的ofstream和ifstream
原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...
- nodejs html多语言切换,利用 nodejs 自动生成 Android 语言包实现应用内切换多语言的方案...
Android 默认的多语言支持 在 Android 工程的 res 目录下,通过定义对应的语言文件夹名称就可以实现多语言支持 // 手动切换语言 Resources resources = getR ...
- python下载大文件-使用请求在python中下载大文件
请求是一个非常好的库.我想用它下载大文件(>1GB).问题是不可能将整个文件保存在内存中,我需要将其分块读取.以下代码有问题 1 2 3 4 5 6 7 8 9 10 11import requ ...
最新文章
- 数十篇推荐系统论文被批无法复现:源码、数据集均缺失,性能难达预期
- 算法 字符串转换为以为数组
- 【论文理解】ArcFace: Additive Angular Margin Loss for Deep Face Recognition(InsightFace)
- LVS集群---做前端调度器搭建使用
- Visual Studio 2010生成SQL Server测试数据
- 大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解
- 杂项-Server:Serv-U
- 1、Ribbon相关组件初始化 - Ribbon 核心原理与源码分析
- dup和dup2详解
- python 爬虫入门(3) proxy详解 代理详解
- 在Ubuntu18.04TLS下安装小米随身wifi驱动
- python加法运算符可以用来连接字符串并生成新字符串_中国大学MOOCPython语言入门网课答案...
- vue实现非同源图片的下载功能--跨域问题(解决浏览器打开图片,而不是下载)
- 重启osd服务失败:Start request repeated too quickly
- js动态点击放大缩小图片
- 元宇宙的驱动力是什么?
- 如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源
- keil错误和解决办法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘
- Flutter低版本升级NullSafety
- 魔鬼交易员害了法兴银行却救了全球经济?