给一千万个数据量的文件排序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <set>
#include <bitset>
#include <ctime>
#include <cassert>
#include <climits>
#include <algorithm>
#define MAXN 5000000
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

typedef unsigned long long ULL;

int main()
{
    bitset <MAXN> bit_map;
    bit_map.reset();

    //time record
    clock_t begin = clock();

    //read data from data.in file
    FILE *wait_sort_file = fopen("data.in", "r");
    assert(wait_sort_file);
    ULL Num;
    while(~fscanf(wait_sort_file, "%d ", &Num))
    {
        if(Num < MAXN) bit_map.set(Num, 1);
    }
    //write data to data.out file
    FILE *sorted_file = fopen("data.out", "w");
    assert(sorted_file);
    for(int i=0; i<MAXN; i++)
    {
        if(bit_map[i] == 1) fprintf(sorted_file, "%d ", i);
    }
    //seek the offset of file
    int offset = fseek(wait_sort_file, 0, SEEK_SET);
    if(offset) perror("fseek fail");
    else
    {
        //read data again
        bit_map.reset();
        while(~fscanf(wait_sort_file, "%d ", &Num))
        {
            if(Num >= MAXN) bit_map.set(Num-MAXN, 1);
        }
        //write again
        for(int i=0; i<MAXN; i++)
        {
            if(bit_map[i] == 1)
                fprintf(sorted_file, "%d ", i+MAXN);
        }
    }

    clock_t end = clock();
    cout << "cost time: " << (double)(end-begin)/CLOCKS_PER_SEC << endl;

    fclose(wait_sort_file);
    fclose(sorted_file);
    return 0;
}

版权声明:感觉我写的还算不错的的话希望你能够动动你的鼠标和键盘为我点上一个赞或是为我奉献上一个评论,在下感激不尽!_______________________________________________________欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合

时间: 2024-08-29 04:04:01

给一千万个数据量的文件排序的相关文章

MYSQL数据库导入大数据量sql文件失败的解决方案

1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和数据"  .保存文件db_mras.sql文件. 2.导入sql文件.在MYSQL中新建数据库db_mras.选择数据库-----右击选择"运行SQL文件"-----选择文件db_mras.sql,运行. 现在发现运行失败,提示错误"MySQL server has g

如何给10^7个数据量的磁盘文件排序

题目: 输入:给定一个文件,里面最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数),且其中每个数都小于等于n,n=10^7.输出:得到按从小到大升序排列的包含所有输入的整数的列表. 分析: 1.归并排序.你可能会想到把磁盘文件进行归并排序,但题目要求你只有1MB的内存空间可用,所以,归并排序这个方法不行.    2.位图方案.熟悉位图的朋友可能会想到用位图来表示这个文件集合.例如正如编程珠玑一书上所述,用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合,边框用

千万级别数据量mysql优化策略(一)

表结构优化 1.  使用独立表空间 独立表空间指的是innodb表的一种数据结构 独占表空间:  每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件. 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中. 2.  分区表 分区表是一种粗粒度,简易的索引策略,适用于大数据的过滤场景.最适合的场景是,没有合适的索引时,对其中几个分区表进行全表扫描.或者只有一个分区表和索引是热点,而且这个分区和索引能够全部存

大数据量.csv文件导入SQLServer数据库

前几天拿到了一个400多M的.csv文件,在电脑上打开要好长时间,打开后里面的数据都是乱码.因此,做了一个先转码再导入数据库的程序.100多万条的数据转码+导入花了4分钟,感觉效率还可以.各位网友有更好的方法,请在留言中指点下,一起学习学习,多谢了. static void Main(string[] args) { int count = 0; string readerPath=@"C:\Users\Administrator\Desktop\readerDemo.csv"; st

小数据量csv文件数据导入数据库(思路)

大致写写思路,因为sqlserver提供了可以直接导入的图形界面. 1.private static string GetConnectionString(string folderPath)  //文件夹路径 { string [email protected]"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="[email protected]"\;Extended Properties='Text;'"; return

大数据量操作

1.数据量小的表,例如货币码.组织机构码等在客户端程序启动的时候就加载到datatable里,对这些代码信息的访问尽量不去麻烦服务器,在内存里查就可以了.2.建立索引,根据用户的操作习惯,对数据表最经常访问的字段建立索引,并且每个月重建一次.3.尽可能使用最平实的select语句(少用子查询),发挥数据库本身的高效功能(我用的oracle) 我们每天几千万的数据量也没见到有什么瓶颈.关键是你的索引建得合理,尽可能根据需求建索引.当然分区后的性能也应该有很大的提升.根据具体业务 建设相应的缓存机制

Java千万级别数据生成文件思路和优化

一年前写过一个百万级别数据库数据生成配置xml文件的程序,程序目的是用来把数据库里面的数据生成xml文件.程序可以配置多少文件生成到一个文件中去. 程序刚开始设计的时候说的是最多百万级别数据,最多50W数据生成到一个xml文件里面去,所以在做测试的时候自己也只是造了100W的数据并没有做过多数据量的测试,然后问题就来了....由于程序使用的局点数据量巨大,需要生成xml文件的客户资料接近千万级别的程度,而现场对程序的配置大约是100W条数据生成一个xml文件里面去,程序在这样的大数据量下面偶尔会

SQLSERVER 文件组解决大数据量数据存储

如何使用文件组解决大数据量的读写性能差问题,具体操作步骤如下: 在企业管理器中,右键点你的数据库,选属性,选数据文件,新增一个,文件填一下,位置填一下,文件组填一个,比如abc---确定. 然后你可以右键点你数据库里面的表,设计表,再点右键,属性,然后把表文件组和文本文件组改成abc,就把你原来的表从原来的大mdf文件中分解到你的新增文件中了. 再增加文件的话,方法同上,目的就是把主文件(MDF)拆分成多个文件:利用文件组的好处是不改变数据库的数据,能把已有的mdf文件拆分成多个 最后,一定要使

使用内存映射文件MMF实现大数据量导出时的内存优化

前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv同理),excel包含1~n个sheet,在每个sheet中存储的按行和列的坐标在单元格存储具体数据,如果我们要使用MMF,第一个要考虑的就是如何将整个excel合理的存储到MMF中.这里我们引入MMF两个对象: MemoryMappedFile --表示内存映射文件 MemoryMappedVie