`
什么世道
  • 浏览: 222769 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

位映射对大数据排重与排序

阅读更多

利用位映射原理对大数据排重

    问题提出:M(如10亿)个int整数,只有其中N个数重复出现过,读取到内存中并将重复的整数删除。

 

    问题分析:我们肯定会先想到在计算机内存中开辟M个int整型数据数组,来one bye one读取M个int类型数组, 然后在一一比对数值,最后将重复数据的去掉。当然这在处理小规模数据是可行的。

            

我们 考虑大数据的情况:例如在java语言下,对10亿个int类型数据排重。

 

java中一个 int 类型在内存中占4 byte。那么10亿个int类型数据共需要开辟10 ^ 9次方 *4 byte ≈ 4GB 的连续内存空间。以 32 位操作系统电脑为例,最大支持内存为 4G, 可用内存更是小于4G。所以上述方法在处理大数据时根本行不通。

 

    思维转化:既然我们不能为所有 int 类型的数据开辟 int 类型数组,那么可以采取更小的数据类型来读取缓存 int 类型数据。考虑到计算机内部处理的数据都是 01 序列的bit,那么我们是否可以用 1bit 来表示一个 int 类型数据。

 

   位映射的引出:使用较小的数据类型指代较大的数据类型。如上所说的问题,我们可以用1个 bit 

来对应一个int 整数。假如对应的 int 类型的数据存在,就将其对应的 bit 赋值为1,否则,赋值为0(boolean类型)。java中 int 范围为 -2^31  到  2^31-1. 那么所有可能的数值组成的长度为2^32. 对应的 bit 长度也为 2^32.  那么可以用这样处理之后只需要开辟2^32 bit  = 2^29 byte = 512M 大小的 内存空间 。显然,这样处理就能满足要求了。虽然对内存的消耗也不太小,暂时这样处理吧。

 

   问题解决方案: 首先定义如下图的int - byte 映射关系,当然,映射关系可以自定义。但前提要保证你的数组上下标不能越界。

 

 



 

但如上定义的bit[]数组显然在计算机中是不存在的,所我们需要将其转化为 java 中的一个基本数据类型存储。显然,byte[] 是最好的选择。

 

将其转化为byte[] 数组方案:

自定义的映射关系表,每个bit对应一个 int 数值,鄙人将 int 的最大值,最小值与数组的最大最小索引相对应。从上图可以看出来 int 数值与bit索引相差 2^31次方。当然,你也可以定义其他的映射关系,只是注意不要发生数组越界的情况。由于最大值可能是2^32,故用long接收。

long bitIndex = num + (1l << 31);

 

计算在转化为byte[]数组的索引,由于上面定义的bitIndex 索引是非负数,故无需引入位运算去符号。

 int index = (int) (bitIndex / 8); 

 

计算bitIndex 在byte[]数组索引index 中的具体位置。

 int innerIndex = (int) (bitIndex % 8);

 

引入位运算将byte[]数组索引index 的各个位按权值相加

dataBytes[index] = (byte) (dataBytes[index] | (1 << innerIndex));

 

这样就解决了整个大数据读取排重的问题。

 

那么怎么将其读取出来呢?怎么对数据进行排序?

 

那就只需要按照byte[]数组进行一一对应到 int 类型数据上即可。

以下代码升序输出为例。

 

遍历数组,采取与之前映射关系的逆运算来还原数据。

 

 for (int i = 0; i < bytes.length; i++) {

            for (int j = 0; j < 8; j++) {

                if (!(((bytes[i]) & (1 << j)) == 0)) {

                    int number = (int) ((((long) i * 8 + j) - (1l << 31)));

                }

            }

        } 

 }

 

 

由于编译软件默认设置的JVM内存是128—400M左右,测试此程序明显是不够的,所以需要调节一下分配给JVM的内存。否则,不管怎样运行,都会出现Exception in thread "main" java.lang.OutOfMemoryError: Java heap space...

 

eclipse:选择run->run configuration->arguments,输入-Xms256M -Xmx1024M(-Xms代表jvm启动时分配的内存大小,-Xmx代表可最大分配多少内存)

Intellij IDEA修改安装目录/IntelliJ IDEA 7.0/bin下idea.exe.vmoption文件 

    -Xms256M 
    -Xmx1024M 
  
    

 

 

源代码:

 

package com.MassSort20131103;

import java.util.Random;


/**
 * Created with IntelliJ IDEA.
 * User: YangKang
 * Date: 13-11-3
 * Time:上午11:32
 * To change this template use File | Settings | File Templates.
 */
public class BigDataSort {

    private static final int CAPACITY = 1 000 000 000;//数据容量

    // 定义一个byte数组缓存所有的数据
    private byte[] dataBytes = new byte[1 << 29];

    public static void main(String[] args) {
        BigDataSort ms = new BigDataSort();

        byte[] bytes = null;

        Random random = new Random();
        for (int i = 0; i < CAPACITY; i++) {
            int num = random.nextInt();
            System.out.println("读取了第 " + (i + 1) + "\t个数: " + num);
            bytes = ms.splitBigData(num);
        }
        System.out.println("");
        ms.output(bytes);
    }


    /**
     * 读取数据,并将对应数数据的 到对应的bit中,并返回byte数组
     * @param num 读取的数据
     * @return byte数组  dataBytes
     */
    private byte[] splitBigData(int num) {

    	long bitIndex = num + (1l << 31);         //获取num数据对应bit数组(虚拟)的索引
    	int index = (int) (bitIndex / 8);         //bit数组(虚拟)在byte数组中的索引
        int innerIndex = (int) (bitIndex % 8);    //bitIndex 在byte[]数组索引index 中的具体位置

        System.out.println("byte[" + index + "] 中的索引:" + innerIndex);

        dataBytes[index] = (byte) (dataBytes[index] | (1 << innerIndex));
        return dataBytes;
    }

    /**
     * 输出数组中的数据
     * @param bytes byte数组
     */
    private void output(byte[] bytes) {
        int count = 0;
        for (int i = 0; i < bytes.length; i++) {
            for (int j = 0; j < 8; j++) {
                if (!(((bytes[i]) & (1 << j)) == 0)) {
                	count++;
                    int number = (int) ((((long) i * 8 + j) - (1l << 31)));
                    System.out.println("取出的第  " + count + "\t个数: " +  number);
                }
            }
        }
    }
}

 

 

 

  • 大小: 39.1 KB
4
1
分享到:
评论
9 楼 chenzehe 2013-11-06  
mark支持下
8 楼 什么世道 2013-11-06  
fourfireliu 写道
youtl 写道
将这么大的数据读到内存中,是不合理的。删除重复数据可以借鉴压缩的原理。
建一个对象{int first,int num},为了节约空间,用int[2]存储就行。然后用有序二叉树保存起来。比如[5,3]表示5,6,7三个数。
当你从文件中读出一个int,就在二叉树中查找是否存在当前数字,如果有的话就去掉,如果没有的话,再判断是否能跟上界以及下界压缩保存,不能的话,才需要将它存储起来。

它这个一样可以分段存文件最后考虑压缩 不见得非要2叉树

分段排序存文件可能是一个比较理想的方式,占用内存可以非常少。时间上全部读入内存可能快一点。在时间和空间上找个平衡吧。
7 楼 fourfireliu 2013-11-06  
youtl 写道
将这么大的数据读到内存中,是不合理的。删除重复数据可以借鉴压缩的原理。
建一个对象{int first,int num},为了节约空间,用int[2]存储就行。然后用有序二叉树保存起来。比如[5,3]表示5,6,7三个数。
当你从文件中读出一个int,就在二叉树中查找是否存在当前数字,如果有的话就去掉,如果没有的话,再判断是否能跟上界以及下界压缩保存,不能的话,才需要将它存储起来。

它这个一样可以分段存文件最后考虑压缩 不见得非要2叉树
6 楼 fourfireliu 2013-11-06  
我记得这是编程珠矶里的例子 不过lz把它用java实现了
5 楼 youtl 2013-11-06  
不好意思,没有代码。如果要保存在磁盘中,可以从树中读取,也就是说数据是根据树的结果去生成。
其实int[2]的压缩方式还是压缩率不够高的,如果是long类型的话,也不见得吃的消。如有必要还可以引入byte[2]数组之类的,沿着这条路进行下去,总有办法解决long的排序问题,只是代码估计就复杂了。但你用的方法,就只能解决int类型的。而且jvm内存占用也不低,jvm是没办法使用电脑所有内存的。
还有一个有效的方法,是对数字进行分段加载,将未处理的数字,用硬盘先存储起来。
4 楼 9344187 2013-11-06  
youtl 写道
将这么大的数据读到内存中,是不合理的。删除重复数据可以借鉴压缩的原理。
建一个对象{int first,int num},为了节约空间,用int[2]存储就行。然后用有序二叉树保存起来。比如[5,3]表示5,6,7三个数。
当你从文件中读出一个int,就在二叉树中查找是否存在当前数字,如果有的话就去掉,如果没有的话,再判断是否能跟上界以及下界压缩保存,不能的话,才需要将它存储起来。


请问采用二叉树的方式,怎样让数据保存在磁盘中呢?有相应的代码参考一下吗?
3 楼 zhangyan19870108 2013-11-05  
lz思路很好
2 楼 zhangyan19870108 2013-11-05  
1 楼 youtl 2013-11-05  
将这么大的数据读到内存中,是不合理的。删除重复数据可以借鉴压缩的原理。
建一个对象{int first,int num},为了节约空间,用int[2]存储就行。然后用有序二叉树保存起来。比如[5,3]表示5,6,7三个数。
当你从文件中读出一个int,就在二叉树中查找是否存在当前数字,如果有的话就去掉,如果没有的话,再判断是否能跟上界以及下界压缩保存,不能的话,才需要将它存储起来。

相关推荐

    大数据网络中结构体排序的扩展与应用.pptx

    ### 大数据网络中结构体排序的扩展与应用 #### 一、大数据网络结构体排序的概念 **1.1 大数据网络结构体排序的基本理解** - **定义**:大数据网络结构体排序是指在海量数据集中对复杂结构数据进行排序的技术。...

    hadoop大数据技术原理与应用ppt

    【Hadoop大数据技术原理与应用】是现代大数据处理的核心框架之一,它由Apache软件基金会开发,主要用于处理和存储海量数据。Hadoop的出现解决了传统单机系统无法应对的大量非结构化和半结构化数据的问题,它以分布式...

    2017年山东大学大数据管理与分析考试题

    ### 2017年山东大学大数据管理与分析考试题知识点解析 #### 一、HDFS数据存放、读取和复制的过程 **HDFS (Hadoop ...以上是对2017年山东大学大数据管理与分析考试题中涉及知识点的详细解析,希望对您有所帮助。

    如何对大数据进行词频统计.pdf

    这一步可能需要额外的排序和比较操作,但总体来说,由于我们已经将问题规模缩小到每个文件的TOP10,因此这个步骤的复杂度相对较低。 总结起来,处理大数据词频统计的关键策略包括: 1. 利用哈希函数进行数据分片,...

    java的大数据读写

    "java的大数据读写"这个标题暗示了我们关注的重点是如何高效地处理大量数据,这通常涉及到内存管理、I/O操作以及可能的数据排序算法。描述中提到的小程序展示了如何读取和写入超过1GB的文件,这是大数据处理中的常见...

    中科院大数据系统与大规模数据集分析教程 大数据挖掘教程 5_大数据运算系统(1) 共10页.pdf

    Shuffle阶段则根据键对数据进行排序和分区;最后,Reduce阶段对每个键的值进行聚合操作,生成最终结果。 Hadoop是MapReduce的开源实现,由Doug Cutting和Mike Cafarella在2005年开始,随着Yahoo! Lab的参与和推动,...

    大数据情况下桶排序算法的运用与C++代码实现示例

    桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到若干个“桶”中,每个桶再单独进行排序,最后按照每个桶内元素的顺序依次合并,从而得到整体有序的结果。这种算法在处理大量数据时,如果数据...

    腾讯:大数据平台与推荐应用架构.pdf

    腾讯大数据平台与推荐应用架构是腾讯公司内部大数据处理与推荐系统技术的概述性文档,其中涵盖了腾讯大数据的发展现状、平台的基础架构以及如何通过大数据实现实时精准推荐。在这个主题下,我们可以提取出以下几点...

    大数据技术高频面试题

    - **排序算法**:冒泡排序、二分查找、快速排序和归并排序都是基础的算法题目,考察候选人的编程能力和理解基础算法的能力。 - **Spark编程**:手写Spark-WordCount程序,这是Spark入门的经典例子,用于统计文本中的...

    大数据-算法-关于slice正则函数与强拟凸域的全纯自映射的研究王谢平.pdf

    【大数据与算法】在当前的信息时代,大数据与算法已经成为信息技术领域的核心组成部分。大数据是指规模巨大、类型多样、处理速度快且价值密度低的数据集合,它涵盖了从互联网用户行为、物联网设备产生的实时信息到...

    大数据科学与应用慕课.doc

    ### 大数据科学与应用知识点概述 #### 一、大数据在国际商务中的应用 ##### 1. 国际商务专业背景 - **国际商务**是一门综合性的边缘学科,涉及经济学、管理学等多个领域。 - **核心课程**包括西方经济学、国际经济...

    N个大数据统计算法

    第一种方法使用了多层映射,而第二种方法则通过自定义类并调整集合的排序规则来达到目的。 总的来说,处理大数据时,我们可以借助于C++标准库中的容器和算法,或者根据需求自定义数据结构和操作。这不仅能够帮助...

    自己用C#写的六种排序算法实例

    哈希排序通常与哈希表有关,不直接对元素进行排序,而是利用哈希函数将元素映射到数组的特定位置,然后直接访问这些位置以获取排序结果。然而,哈希排序在处理大量重复数据时可能效率下降,因为哈希冲突可能导致...

    numpy数据分析源代码+大数据的读取_.ipynb

    详细的,有解释的源代码哦 pandas数据处理 1、删除重复元素 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True ...大数据读取

    大数据的一些面试题.pdf

    综合这些知识点,面试时可能会遇到的具体问题包括:在内存有限的情况下,如何统计大量数据的不重复元素、计算中位数、建立索引、实现倒排索引、外排序处理大文件、用Trie树去除重复字符串、以及利用MapReduce进行...

    Hadoop大数据开发基础

    1. Map阶段:数据本地化,将输入数据分割成键值对,映射到各个节点进行处理。 2. Shuffle & Reduce阶段:中间结果排序、分区,再由Reduce函数进行聚合操作。 **四、YARN概述** 1. YARN的引入:为了解决MapReduce v1...

    大数据升序优化.pptx

    #### 一、大数据排序算法概述 1. **外部排序算法** - **定义**: 当数据量超出内存限制时使用的排序技术。 - **实现**: 数据被分割成较小的块,在外部存储设备(如硬盘)上进行排序。 - **常见算法**: 包括归并...

    精品课程推荐 大数据与云计算教程课件 优质大数据课程 17.Hive查询(共32页).pptx

    为了让读者能够深入了解并掌握这些技术,本文将重点介绍《大数据与云计算教程课件》系列中的《Hive查询》课程内容,以及这套课程对初学者和专业人士的重要意义。 《Hive查询》作为《大数据与云计算教程课件》系列中...

    大数据系列-Hbase

    HBase的数据模型基于稀疏、多维度、排序的映射表,其中行键、列族、列和时间戳共同决定了一个单元格的位置。这种模型允许快速地对大量稀疏数据进行操作。 ### 3. HBase的架构 - **Region Server**: 存储和处理表的...

Global site tag (gtag.js) - Google Analytics