当前位置: 首页 > 面试题库 >

Java中大型数据集的基于文件的合并排序

干弘深
2023-03-14
问题内容

给定不适合内存的大型数据集,是否有任何库或api在Java中执行排序?该实现可能类似于linux实用程序排序。


问题答案:

Java提供了一个通用的排序例程,该例程可用作您的问题的大型解决方案的一部分。排序太大而无法容纳在内存中的数据的常用方法是:

1)读取尽可能多的数据,使其适合主存储器,比如说1 Gb

2)快速排序1 Gb(在这里使用Collections框架中的Java内置排序)

3)将排序后的1 Gb作为“块1”写入磁盘

4)重复步骤1-3,直到遍历所有数据,然后将每个数据块保存在单独的文件中。因此,如果您的原始数据为9 Gb,则现在将有9个分类为“ chunk-1”到“
chunk-9”的数据块

5)现在,您只需要最后的合并排序即可将9个已排序的块合并到一个完全已排序的数据集中。合并排序将非常有效地处理这些预排序的块。它实际上将打开9个文件读取器(每个块一个),以及一个文件写入器(用于输出)。然后,它比较每个读取文件中的第一个数据元素,并选择最小值,该最小值将被写入输出文件。所选值所来自的读取器前进到其下一个数据元素,并重复9路比较过程以找到最小值,并将答案再次写入输出文件。重复此过程,直到从所有块文件中读取了所有数据为止。

6)第5步完成所有数据的读取后,您就可以完成了-输出文件现在包含已完全排序的数据集

使用这种方法,您可以轻松地编写自己的通用“
megasort”实用程序,该实用程序采用文件名和maxMemory参数,并通过使用临时文件有效地对文件进行排序。我敢打赌,您至少可以找到一些实现此目的的方法,但是如果没有,您可以按照上述方法自行开发。



 类似资料:
  • 问题内容: 是否有任何库在Java中创建使用文件作为数据库的程序,而不必在要使用它的计算机上安装数据库服务? 问题答案: Derby和Hypersonic SQL均可在内存和服务器模式下运行。

  • 我有一只这样的熊猫 我如何根据集合(例如)中的值对其进行排序 设置顺序=('1','3','2','4') 产量 谢谢

  • 我正在搜索半径3公里内的用户,基于用户的长/拉特。我正在比较auth long/lat和附近的用户long/lat。它返回具有距离的用户集合。 现在我很难按距离排序。 如果我添加orderBy('距离','desc')当然会导致一个错误,因为我的DB上没有距离列。 这是一种排序和分页的方法。

  • 本文向大家介绍基于java中集合的概念(详解),包括了基于java中集合的概念(详解)的使用技巧和注意事项,需要的朋友参考一下 1.集合是储存对象的,长度可变,可以封装不同的对象 2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加) 就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类. 二每一个容器的数据结构不同,所以取出的动作

  • 我有一个“数据库选择”和体系结构问题。 用例: 客户端将上载大型。json文件(或其他格式,如.tsv,不相关),其中每一行都是关于其客户的数据(例如姓名、地址等) 我的要求: > 数据库应该有某种复制,因为我们不想丢失数据。 不需要索引,因为我们只是流数据。 对于这个问题,您对数据库有什么建议?我们尝试将其上传到Amazon S3并让他们处理缩放等问题,但存在读取/流式传输缓慢的问题。 谢了伊凡

  • 为了生成某些情况下的概率密度函数,可能需要考虑100万次观测。当我使用numpy数组时,遇到了大小限制32。 是不是太少了? 在这种情况下,我们如何存储32个以上的元素,而不将元素分布到不同的列中,或者在数组中分布数组?