当前位置: 首页 > 知识库问答 >
问题:

用于大量按块可变长度数据的外部排序

彭成天
2023-03-14

我需要对块变长数据应用一些排序算法。以下是限制条件:

>

  • 数据长度不是固定的。

    块大小是固定的。

    一个块包含单个/多个数据。

    考虑我需要外部排序。RAM无法保存整个数据集。数据集大小为20 GB。在这里我可以使用高达2GB的RAM。

    示例:为了简单起见,每个元素都是块中的空格分隔字。

    考虑块大小为26(包括空间),第一块包含5个元素,而第二块仅包含3个元素。

    由于块的大小是固定的,排序后的数据可能包含比分类后的块更多的块。

    阻碍:

    [哈利罗恩德拉科黑魔王][赫敏隆巴顿伏地魔]

    已排序的块:

    [黑暗巨龙哈利赫敏][隆巴顿罗恩勋爵][伏地魔]

    对于这种情况,哪种算法/技术是有效的?

  • 共有2个答案

    王君墨
    2023-03-14

    外部合并排序将起作用。语句“排序的数据可能包含比分类的更多的块”意味着数据记录不跨越块,因此在排序和合并过程中,由于块中未使用的空间,块的数量可能会有所不同。第一步是将一组块读入内存,对数据记录进行排序,然后将排序后的块写入文件,重复此过程,直到处理完所有原始数据。其余的过程合并文件,直到生成一个已排序的文件。这个过程可以使用k路合并,其中最简单的是2路合并。为了k

    长孙玉泽
    2023-03-14

    我的第一个倾向是:

    编写一个脚本,读取输入文件,删除块并写入顺序文件。即,获取包含以下内容的文件:

    [Harry Ron Draco Dark Lord] [Hermione Longbottom Voldemort]
    

    然后写这个文件:

    Harry
    Ron
    Draco
    Dark
    Lord
    Hermione
    Longbottom
    Voldemort
    

    然后,使用系统的排序实用程序(例如GNUsort)对文件进行排序,给出:

    Dark
    Draco
    Harry
    Hermione
    Lord
    Longbottom
    Ron
    Voldemort
    

    然后,编写一个脚本,读取该文件并构造块,将它们写入最终输出。

    就运行时间而言,这几乎肯定不是最有效的,但它简单、可靠、易于编码,并且易于证明正确。您可能可以在一两个小时内编写代码并使用数据子集进行测试。然后将其设置为在整个数据集上工作。

     类似资料:
    • 问题内容: 这是一个表结构(例如测试): 查询如下: 但是我想按 字段大小/ 字段描述的 长度 排序。字段类型将为TEXT或BLOB。 问题答案: 该函数以字节为单位给出字符串的长度。如果要计算(多字节)字符,请改用以下函数:

    • 问题内容: 我做了一个字谜游戏机,并且有一系列正面匹配。麻烦的是它们都以不同的顺序排列,我希望能够对数组进行排序,以使最长的数组值首先出现。 有人对如何执行此操作有任何想法吗? 问题答案: 使用http://us2.php.net/manual/en/function.usort.php 使用此自定义功能 如果要保留旧索引,请使用uasort;如果您不关心,请使用usort。 另外,我认为我的版本

    • 问题内容: 我如何遍历可变长度的Java数组。 我想我会设置一个while循环,但是如何检测到数组末尾。 我想我想要这样的东西[只需要弄清楚如何表示myArray.notEndofArray()] 问题答案: 要么 第二个版本是“ for-each”循环,它适用于数组和Collections。大多数循环可以使用for- each循环完成,因为您可能并不在乎实际的索引。如果您确实关心实际索引,请使用

    • 问题内容: 我外面有一个数组: 我想让我的函数可以访问其外部的数组,以便可以向其添加值 如何为函数赋予正确的作用域范围? 问题答案: 默认情况下,当您在函数内部时,您无权访问外部变量。 如果您希望函数可以访问外部变量,则必须在函数内部将其声明为: 有关更多信息,请参见 可变作用域 。 但是请注意, 使用全局变量不是一个好习惯 :通过这种方法,您的函数不再是独立的。 一个更好的主意是使您的函数 返回

    • 问题内容: 我发现有很多线程可以按这里的值进行排序,但是它似乎对我不起作用… 我有一个包含元组的列表字典。每个列表都有不同数量的元组。我想按每个列表包含多少个元组对字典进行排序。 这可能吗? 问题答案: d = {“one”: [(1,3),(1,4)], “two”: [(1,2),(1,2),(1,3)], “three”: [(1,1)]} >>> for k in sorted(d, ke

    • 问题内容: 我有一个带有列的表,其中包含如下所示的字符串。 我需要从第二次出现到字符串结尾获取子字符串,并且您可以看到子字符串的长度不是固定的。第一部分并不总是固定的,它可以改变。到目前为止,我正在使用以下代码来实现它。 如您所见,我采用一个任意大的值作为长度来处理可变长度。有更好的方法吗? 问题答案: 您可以与函数结合使用,找到的最后一次出现,还可以使用从字符串末尾获取指定数量的字符。 SQLF