利用位映射原理对大数据排重
问题提出: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); } } } } }
相关推荐
### 大数据网络中结构体排序的扩展与应用 #### 一、大数据网络结构体排序的概念 **1.1 大数据网络结构体排序的基本理解** - **定义**:大数据网络结构体排序是指在海量数据集中对复杂结构数据进行排序的技术。...
【Hadoop大数据技术原理与应用】是现代大数据处理的核心框架之一,它由Apache软件基金会开发,主要用于处理和存储海量数据。Hadoop的出现解决了传统单机系统无法应对的大量非结构化和半结构化数据的问题,它以分布式...
### 2017年山东大学大数据管理与分析考试题知识点解析 #### 一、HDFS数据存放、读取和复制的过程 **HDFS (Hadoop ...以上是对2017年山东大学大数据管理与分析考试题中涉及知识点的详细解析,希望对您有所帮助。
这一步可能需要额外的排序和比较操作,但总体来说,由于我们已经将问题规模缩小到每个文件的TOP10,因此这个步骤的复杂度相对较低。 总结起来,处理大数据词频统计的关键策略包括: 1. 利用哈希函数进行数据分片,...
"java的大数据读写"这个标题暗示了我们关注的重点是如何高效地处理大量数据,这通常涉及到内存管理、I/O操作以及可能的数据排序算法。描述中提到的小程序展示了如何读取和写入超过1GB的文件,这是大数据处理中的常见...
Shuffle阶段则根据键对数据进行排序和分区;最后,Reduce阶段对每个键的值进行聚合操作,生成最终结果。 Hadoop是MapReduce的开源实现,由Doug Cutting和Mike Cafarella在2005年开始,随着Yahoo! Lab的参与和推动,...
桶排序(Bucket Sort)是一种分布式排序算法,它将要排序的数据分布到若干个“桶”中,每个桶再单独进行排序,最后按照每个桶内元素的顺序依次合并,从而得到整体有序的结果。这种算法在处理大量数据时,如果数据...
腾讯大数据平台与推荐应用架构是腾讯公司内部大数据处理与推荐系统技术的概述性文档,其中涵盖了腾讯大数据的发展现状、平台的基础架构以及如何通过大数据实现实时精准推荐。在这个主题下,我们可以提取出以下几点...
- **排序算法**:冒泡排序、二分查找、快速排序和归并排序都是基础的算法题目,考察候选人的编程能力和理解基础算法的能力。 - **Spark编程**:手写Spark-WordCount程序,这是Spark入门的经典例子,用于统计文本中的...
【大数据与算法】在当前的信息时代,大数据与算法已经成为信息技术领域的核心组成部分。大数据是指规模巨大、类型多样、处理速度快且价值密度低的数据集合,它涵盖了从互联网用户行为、物联网设备产生的实时信息到...
### 大数据科学与应用知识点概述 #### 一、大数据在国际商务中的应用 ##### 1. 国际商务专业背景 - **国际商务**是一门综合性的边缘学科,涉及经济学、管理学等多个领域。 - **核心课程**包括西方经济学、国际经济...
第一种方法使用了多层映射,而第二种方法则通过自定义类并调整集合的排序规则来达到目的。 总的来说,处理大数据时,我们可以借助于C++标准库中的容器和算法,或者根据需求自定义数据结构和操作。这不仅能够帮助...
哈希排序通常与哈希表有关,不直接对元素进行排序,而是利用哈希函数将元素映射到数组的特定位置,然后直接访问这些位置以获取排序结果。然而,哈希排序在处理大量重复数据时可能效率下降,因为哈希冲突可能导致...
详细的,有解释的源代码哦 pandas数据处理 1、删除重复元素 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True ...大数据读取
综合这些知识点,面试时可能会遇到的具体问题包括:在内存有限的情况下,如何统计大量数据的不重复元素、计算中位数、建立索引、实现倒排索引、外排序处理大文件、用Trie树去除重复字符串、以及利用MapReduce进行...
1. Map阶段:数据本地化,将输入数据分割成键值对,映射到各个节点进行处理。 2. Shuffle & Reduce阶段:中间结果排序、分区,再由Reduce函数进行聚合操作。 **四、YARN概述** 1. YARN的引入:为了解决MapReduce v1...
#### 一、大数据排序算法概述 1. **外部排序算法** - **定义**: 当数据量超出内存限制时使用的排序技术。 - **实现**: 数据被分割成较小的块,在外部存储设备(如硬盘)上进行排序。 - **常见算法**: 包括归并...
为了让读者能够深入了解并掌握这些技术,本文将重点介绍《大数据与云计算教程课件》系列中的《Hive查询》课程内容,以及这套课程对初学者和专业人士的重要意义。 《Hive查询》作为《大数据与云计算教程课件》系列中...
HBase的数据模型基于稀疏、多维度、排序的映射表,其中行键、列族、列和时间戳共同决定了一个单元格的位置。这种模型允许快速地对大量稀疏数据进行操作。 ### 3. HBase的架构 - **Region Server**: 存储和处理表的...