一种大文件的排序方法

大文件排序 问题:一个最多包含n个没有重复正整数的文件,每个数都小于n,其中n为10的7次方。最多有1MB的内存空间可用,用充足的磁盘空间可用。 方案一:基于磁盘的归并排序 方案二:         如果每个号码都用7个字节来存储,那么在可用的1MB的存储空间里大约可以存143000个号码。如果每个号码都用32位整数来表示的话,在1MB的存储空间里就可以储     250000个号码。因此,可以使用 阅读详情

要求:一个文件中存有若干单词,每行一个,要求将文件中的单词按字典序排序。

分析:由于一个文件的大小可能超过内存大小,因此想要一次将整个文件全部读入内存后再进行排序是不现实的。当然,处理此问题可以采用归并法:把大文件拆分成多个可以一次读入内存的小文件,再对小文件进行排序后再归并。不过在此介绍另一种方法:以“磁盘空间”换内存空间,在文件内部进行冒泡排序。

算法思路:读取文件中的第1、2两个单词,若第1个比第2个大,则交换两个单词在文件中的位置,将单词直接写回文件。再读出第3个单词,并比较第2、3个单词的大小,依次类推。这样第1轮排序后最大的一个单词就到了文件的末尾,n-1轮后整个文件就排序完成了。实现代码如下:

void SortFile(FILE* fp, unsigned int wordNum, unsigned int maxWordLen)
{
 long curWordPos, nextWordPos;
 char * curWord = (char*)malloc(maxWordLen+2);
 char * nextWord = (char*)malloc(maxWordLen+2);
 int err;
 assert(curWord != NULL && nextWord != NULL);

 for(unsigned int i = 0; i < wordNum-1; i++)
 {
  curWordPos=0;
  err = fseek(fp, curWordPos,SEEK_SET);
  assert(!err);

  fgets(curWord, maxWordLen, fp);
  for(unsigned int j = i; j < wordNum-1; j++)
  {
  nextWordPos = curWordPos+strlen(curWord);
  err = fseek(fp, nextWordPos,SEEK_SET);
  assert(!err);

  fgets(nextWord, maxWordLen, fp);
  if(StringCompare(curWord, nextWord) > 0)
  {
  err = fseek(fp, curWordPos,SEEK_SET);
  assert(!err);

  curWordPos += strlen(nextWord);
  fputs(nextWord,fp);
  fputs(curWord,fp);
  }
  else
  {
  curWordPos += strlen(curWord);
  strcpy(curWord, nextWord);
  }
  } 
 }

 free(curWord);
 free(nextWord);
}

在使用此函数前,应该能方便的获取到文件中单词的个数(wordNum)以及文件中最长的单词的长度(maxWordLen)。在文件中某个具体位置进行读写操作需要用到fseek函数。此外,打开文件时需要以读写方式打开(fopen时参数为使用"r+")。打开文件前需要设置文件读写模式为二进制方式(调用_set_fmode(_O_BINARY))避免C函数库将”/r/n”进行合并。

既然是以“磁盘空间”换内存空间,那么效率会不会降低?答案是不会!了解文件系统的操作原理就会明白,在进行文件读写时,fputs实际上是将文件内容写到了系统内存空间,仍然是在内存中进行操作。因此将此方法称作以系统内存空间换用户内存空间应该更加准确!而且此方法在用户内存空间只用到了两个单词大小的内存,相反效率比归并算法还会更高!

数据结构-大文件排序 2. 可以将这个数划分为64个空间,每个空间是67108864个数,例如,第0个区间(0-67108863)、第1个区间(67108864-134217728)、第i个区间(67108864i - 67108864(i+1)-1)4. 针对每个小文件再次利用hash的思想,例如第0个区间,申请一个长度为67108864的bit map, 占用空间大概8M(8个bit为1B, 长度为67108864的bit类型的数组bitarr占用8M的空间)7. 将64个区间有序的数据进行合并,则为最后大文件有序的数据。 阅读详情

相关推荐

大数据分治思想:查找大文件相同两行、大文件全排序

目录1. 查找大文件相同两行2. 大文件全排序 1. 查找大文件相同两行 题目:有一个2T的文本文件,只存在2行相同的数据,请用一台256M内存的单机服务器,找出这相同的2行数据 解决步骤: 读取一条数据A,求A的hashcode,然后取模,即X = a.hashcode % 10000,X的范围为0 ~ 9999,将数据A保存到fileX文件中 按步骤1进行文件的遍历,处理剩余的每条数据。这样2T的文件被分割成10000个小文件,但相同的2行数据肯定在同一个小文件中 依次处理每个小文件,找出在一个小文件

Bulut0907 1689

外部排序——大文件排序

外部排序 外部排序指的是大文件排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。 一般来说外排序分为两个步骤:预处理和合并排序。首先,根据可用内存的大小,将外存上含有n个纪录的文件分成若干长度为t的子文件(或段);其次,利用内部排序的方法,对每个子文件的t个纪录进行内部排序。这些经过排序的子文件(段)通常称为顺串(run),顺串生成后即将其写入外存。这样在外存上就得到了m个顺串(m=[n/t])。最后,对这些顺串进行归并

想飞的鱼的博客 3380

大文件排序 超大文件排序

用于超大文件的快速排序,相比比谁的速度更快,占用内存更少,该排序文件经得起你的考验,目前设计的处理能力为40亿行文本的排序。最近更新加入了去重操作。

处理大文件排序的方式--外部排序

引言   一般来说,对一个数组的排序,我们常用冒泡排序、快速排序、堆排序等算法进行排序。这样的数组能够一次性加载到内存中,使用上述的排序算法就能轻而易举进行排序,所以上述的排序算法可以称之为堆内排序。   然而有些场景下,一个待排序的文件可能超过甚至远远大于应用程序的运行内存。这种情况,一次性将文件加载到内存中,明显是不可行的,需要使用其他的排序手段进行排序。外部排序就是一种可行的方案。 基本思想 ...

Shenkh的Java壁橱 2210

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

脑机接口(BCI)从原理到开发实战 10|脑控外设:用脑电波控制机械臂/游戏

摘要: 脑机接口(BCI)的“最后一公里”是将分类结果转化为实际动作的关键环节。本文介绍如何通过指令映射、硬件通信和执行反馈实现脑控外设,包括离散/连续控制策略、防抖处理及串口/蓝牙通信方法。通过两个实战案例(运动想象控制机械臂抓取、P300/SSVEP控制游戏)和完整项目(OpenBCI控制小车),演示了从分类标签到设备动作的完整流程,重点涵盖指令生成算法(多数投票)、Python与Arduino的串口通信集成,为BCI系统落地提供实用解决方案。(149字)

小明的博客 765

排序-JAVA实现【十一】大文件排序

问题说明:有一个无续long型的大文件,超过系统内存,需要对其进行排序。 大文件排序,多线程并发处理: import lombok.SneakyThrows; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import java.io.*; import java.nio.charset.Charse

只因有你,在路上。。。 954

数据去重复_京东商品评论情感分析|文本数据预处理

本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意。所以对于文本评论数据先进行文本预处理是必不可少的一步,把大量的、冗余的、无价值的信息去除,可以极大提高文本数据的质量,精确文本分析结果。1 文本去重1.1文本去重的原因文本数据预处理时,首先应去除文本评论数据中反...

weixin_34556808的博客 2073

排序 Java 大文件排序

排序 Java 大文件排序排序原理排序Java代码实现其他说明 排序原理 如图:(图片来源于网络,如果侵权,请联系我删除) 排序Java代码实现 话不多说,直接上代码 import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; /** * 排序 * * @author Adrian * @date 2020/12/8 16

ImAdrian的博客 592

Java 开发打飞机小游戏(附完整源码)

上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy {

一只独孤的程序猿 1万+

51单片机计算器(源程序+流程图+答辩报告+综合设计)

保姆级讲解!C语言编程,使用51单片机及LCD1602显示屏实现!

m0_57007304的博客 2万+

python3利用归并算法对超过内存限制的超大文件进行排序

上一篇文章《python3实现归并排序算法图文详解》中,我们了解了归并排序算法的基本使用逻辑。这一篇文章我们对这个逻辑进行一个延伸,从内存延伸到对硬盘上的文件进行排序,也就是所谓的外部排序。 文章目录操作场景思路分析代码实现内存表现 操作场景 所谓的大文件就是无法一次性全部读到内存中的文件。 为了操作不真的把我机器的内存都榨干,这里假设机器的内存是300MB,刨除一些系统占用,规定每次读到内存的文件大小不能超过200MB。 我又用下面的程序创建了一个1GB大小的文件 with open('bigfile.t

T型人小付的博客 2936

CarSim仿真快速入门(十八)-CarSim2021中的混合动力和纯电动系统

CarSim和TruckSim包括用于电动汽车(BEV)和混合电动汽车(HEV)的动力总成系统。电动和混合电动系统可与所有现有驱动系统配合使用,例如:FWD,RWD,AWD和多轴驱动系统。混合动力/电动系统模型还包括电池管理控制。CarSim或TruckSim中的默认动力总成是为闭环速度控制器提供的备用动力总成。要安装和使用完整的动力总成,请从Vehicle: Assembly库或Vehicle: Lead Unit 库链接到Powertrain数据集。在“动力总成”界面上,从下拉列表控件中选择以下三个选项

小明师兄的博客 7453

对含有一亿数据的大文件进行排序,要求使用内存小于32MB

大文件排序 题目:有10个文件,每个文件有1000万行,文件内容的每一行为一个整型数字;需要,写一个程序,将所有数字排序,分为10个文件输出,如0号文件包含前1000万个数字,1号文件文件包含1千万-2千万之间的数字,依次类推。 限制:如果使用java,-Xmx需要设置为32MB;其它语言也需限制内存为32MB。 要求:正确输出 使用多线程加分编写时长:24。 小时。提供可运行的程序,以及实现说...

暮鼓的博客 1万+

基于Simulink的超级电容快速响应特性建模与仿真

本文介绍了基于Simulink的超级电容快速响应特性建模与仿真方法。主要内容包括:超级电容的工作原理、一阶RC等效电路模型及其动态电压方程;通过Simulink搭建超级电容模型的两种方法(Simscape Electrical推荐方案和基础模块透明教学方案);仿真100A×100ms放电脉冲下的电压响应特性,并与锂电池进行动态对比;分析超级电容在混合储能系统中的功率分配优势。文章还提供了工程实践要点和扩展方向,如电压均衡、温度影响评估以及与DC-DC变换器集成等。通过建模实践,验证了超级电容在毫秒级响应、高

xiaoheshang_123的博客 98

一句话看懂 vibing-steampunk

摘要: vibing-steampunk(vsp)是一个连接SAP ABAP开发工具(ADT)与AI编码代理(如Claude、GitHub Copilot)的桥梁,通过MCP协议实现自动化代码读写、调试和部署。它利用ADT API直接访问SAP系统,绕过传统GUI操作,支持ECC和S/4HANA等环境。工具提供包分析、依赖检查、LUW行为识别等功能,显著提升ABAP项目维护效率。其创新Hyperfocused模式和方法级编辑大幅降低token消耗,而上下文压缩技术则优化了AI对ABAP代码的理解能力,特别适

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 114

大文件排序问题

题目:有一个大文件,里面记录了若干数字,把这些数字进行排序。文件大小远大于内存大小。 思路:内存极少的情况下,利用分治策略,利用外存保存中间结果,再用多路归并来排序。 (1)按可用内存的大小,把外存上含有n个记录的文件分成若干个长度为L的子文件,把这些子文件依次读入内存,并利用有效的内部排序方法对它们进行排序,再将排序后得到的有序子文件重新写入外存; (2)对这些有序子文件逐趟归并,使其逐渐...

罗布泊coding 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大文件的排序和去重 超级简单的实现

大文件的排序和去重 超级简单的实现 有一道校招生的面试题,是要给一个很大的文件(不能全部放内存,比如1T)按行来排序和去重。 一种简单解决方案就是分而治之,先打大文件分词大小均匀的若干个小文件,然后对小文件排好序,最后再Merge所有的小文件,在Merge的过程中去掉重复的内容。 在Linux下实现这个逻辑甚至不用自己写代码,只要用shell内置的一些命令: split, sort就足够了。...

peterxiaoq的专栏 2193

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大文件使用sort的方法

文件中出现的行, 上面命令只输出只在 sorted_largefile1.txt文件中出现的行,不显示两个文件相同的行。要做文件列表的比较,但是文件有1亿多行,直接比较会很慢,想办法加速。比较排完序的两个大文件, 可以用 comm or diff。两个文件本身的内容顺序不一致,先做排序。:不显示只在第一个文件中出现的行。:不显示只在第二个文件中出现的行。:不显示在两个文件中都出现的行。命令执行需要一定时间。

weixin_42831564的博客 485

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

实现归并排序和大文件排序——题集(十九)

实现归并排序和大文件排序——题集(十八) 今天分享一下实现归并排序和大文件排序的源代码和测试用例。 实现归并排序的源代码和运行示例。 源代码如下: #include using namespace std;     int main(){   system("pause"); return 0; }   运行结果:     有一个大文件内容如下:

就是爱编程-都有人重名的博客 1311

多路归并排序 外排序 大文件排序 java实现

package merge;     import java.io.BufferedReader;   import java.io.BufferedWriter;   import java.io.File;   import java.io.FileReader;   import java.io.FileWriter;   import java.text.SimpleDateFormat;

JAVA上尉 9009

两个上亿行的大文件取交集

前两天看到一哥们百度面试归来后发的帖子,并分享了其百度面试题,其中有一个题大意如下: 现有两个上亿行的文件,每一行都只有一个数字,求这两个文件的交集。 我的思路如下:首先是分别对这两个文件排序,然后,再同时遍历这两个文件。求出交集即可。 下面我对大文件的排序进行了简单的实现。 基本思路如下,首先对大文件进行拆分,一亿行的大文件可以拆分成10个小文件,并分别对这10个小文件进行排...

积累 814

怎么排序超大文件

怎么排序超大文件 外排序 通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是一种“排序-归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到一个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。之后在归并阶段将这些临时文件组合为一个大的有序文件,也即排序结果。 外排序的一个例子是外归并排序(External me...

peterxiaoq的专栏 1382

小内存大文件排序小例子——冒泡、归并

今天刷博客看到一篇文章,讲在有限内存下排序大文件的处理方法,动手写了个小例子: // ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include <vector> #include <algorithm> u...

机器人梦想家 Bing Lee 2715

hash将大文件转成小文件的代码实例,能排序和求TopN

不多哔哔~ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.C...

dingyufei的博客 506
上一篇: C++基本概念总结——构造函数的public/protected/private语义
下一篇: Linux 3.x 内核学习笔记——x86 64位内存管理
林 文
博客等级 码龄18年 14粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值