问题标签 [external-sorting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
702 浏览

r - R:使用 for 循环将与每个唯一事件相关的数据写入单独的文件

我是 R 编码的初学者。我在一列中有 60 个唯一 ID,每个唯一 ID 有 30 个条目,我想编写一个代码,自动为每个唯一 ID 创建单独的文件。此代码适用于单个 ID

当我尝试使用以下代码循环它时。

我得到一个只计算所有唯一 ID (60) 并将它们粘贴到 Excel 表中的文件。

试图将单个 ID 的结构合并到自动循环中。

预期输出 - 60 个唯一文件,每个文件 30 个条目。

有人有什么建议吗?谢谢你。

0 投票
1 回答
27 浏览

algorithm - 如何在文件中存储和删除已排序的项目

我正在尝试按排序顺序将元素存储在文件中。元素将采用以下格式:

每个元素都有一个数字(时间戳)和一个消息(大小是可变的)。

元素必须按时间戳排序。

允许的操作是插入和删除(Pop)。

(增加文件大小不是问题)

我们只能从最底层的元素中删除(即一个接一个地删除)。

目前我已经将它实现为一个链表,当元素数量很大时,它的插入速度非常慢。

存储它的最有效的数据结构是什么?

0 投票
2 回答
340 浏览

arrays - 两个文件之间的外部排序

我正试图通过外部排序来满足我的需求——但我做不到。

要求是对任意大小的文件进行外部排序,但仅使用原始文件和另一个文件(称为fileAfileB) - 包括原始文件在内的两个文件。我可以读/写其中任何一个 - 所以可以在两者之间交换......

我无法弄清楚如何实现这一点 - 因为大多数排序算法都要求您能够对内存中的整个数组进行概览以对其进行排序,对吗?

假设我有一个随机整数数组:

在任何给定时间,我只能将四页(例如四个整数)读入内存。

在每次通过时,这给了我五个单独的数组来排序:

如果我对这些应用内存排序,我会得到:

但是,如果我一次只能将四个页面放入内存中,我看不出如何在没有一些可怕的复杂算法的情况下进一步对它们进行排序,该算法一次又一次地循环整个数组以确保其全部排序。

我完全糊涂了——因为如果不将整个数组读入内存,我们不知道四页之前或之后的元素是什么——所以我们不能真正对它们进行排序?

有人可以帮我解释解决这个问题的关键步骤吗?

0 投票
1 回答
564 浏览

algorithm - 哪种k-merge排序在外部排序中会更高效

我正在解决一个问题,其中我有80GB需要排序的数据。我只有1GB主存储器来对数据进行排序。显然,我们将在这里应用外部排序方法。但我的问题是哪种 k-merge 排序会更有效?

  • 8路合并后10路合并
  • 5路合并后16路合并

K-merge 排序的复杂度是O(nk^2),其中 n 是元素的数量。假设我使用这种方法来计算复杂度:

8路合并后10路合并

5路合并后16路合并

查看时间复杂度5 way merge followed by 16 way merge似乎需要更多时间。你觉得我的流程对吗?我对此不是很有信心。

在此处输入图像描述

更新:@rcgldr 既然你说更大的块大小将花费更少的时间来读/写那么你如何看待这个公式:

根据这个公式,如果块大小很小,那么整体读/写时间也会更短。你觉得这里有什么问题吗?或者我们需要将块的总数与此相乘才能准确了解所需的总时间。

0 投票
1 回答
121 浏览

sorting - 为什么2路归并排序比单路归并排序更高效

我正在阅读来自wikipedia的外部排序,并且需要了解为什么 2 阶段合并比 1 阶段合并更有效。

Wiki:但是,单次合并有一个限制。随着块数量的增加,我们将内存划分为更多的缓冲区,因此每个缓冲区更小,因此我们必须进行许多较小的读取,而不是进行较少的较大读取。

因此,对于 100 MB RAM 中的 50 GB 进行排序,使用单个合并通道效率不高:磁盘搜索需要用来自 500 个块中的每个块的数据填充输入缓冲区(我们读取 100MB / 501 ~ 200KB一次从每个块中)占用大部分排序时间。使用两个合并通道解决了这个问题。那么排序过程可能如下所示:

谁能给我一个简单的例子来很好地理解这个概念。buffers我对在 2 阶段合并中 分配更多资源感到特别困惑。

0 投票
2 回答
117 浏览

java - JVM内存不足

我正在为一个大文件(~30GB)实现一个外部排序,所以在我将这些块写入磁盘之后,我创建了chunks. 但是我得到一个BufferedReader(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"), maxBufferSize)maxBufferSize = Runtime.getRuntime().freeMemory() / chunksOutOfMemory例外。

我猜垃圾收集器没有足够的时间来清理内存(当我停止调试器时它不会抛出异常),但在这种情况下,为什么Runtime.getRuntime().freeMemory()会给出这个结果?

是否可以显式调用垃圾收集,或者唯一的选择是让进程休眠一段时间?

0 投票
1 回答
99 浏览

java - 执行外部排序时出现 StackOverflowError

我正在尝试进行外部合并排序。方法:打开“输出”文件夹中的所有文件,并获取第一行并对其进行排序,并将其写入“最终”文件,然后获取该文件的第二行并重复。我得到一个 StackOverflowError。这里我的文件大小大于内存。

什么可能导致此错误出现?

0 投票
1 回答
467 浏览

algorithm - 设计外存排序算法

如果我有一个非常大的列表存储在需要排序的外部存储器中。假设这个列表对于内存来说太大了,那么在设计外部排序算法时应该考虑哪些主要因素?

0 投票
1 回答
820 浏览

sorting - 外部搜索算法

如果我有一个非常大的排序列表存储在外部存储中。假设这个列表不能被带入内存,那么在这个列表中以伪代码查找键的搜索算法是什么?时间复杂度是多少?设计该算法时还应考虑哪些主要因素?

0 投票
4 回答
474 浏览

sorting - gnu-sort - 当它说合并选项“不排序”时,手册是什么意思

我正在尝试对一个太大而无法放入内存的文件进行排序。选项 -m 下的 gnu sort 说明:merge already sorted files; do not sort. 我正在努力理解这一点的含义,以确保排序完成我想要的。这篇文章(在 Pandas 中对大型数据集进行排序) 建议结合使用 gnu split 和 gnu sort 来完成这样的任务,方法是首先将文件分成适合内存的较小部分,分别对它们进行排序,然后重新组合。到目前为止,我的实验似乎表明这个程序确实有效。尽管如此,我对手册中合并选项的描述感到困扰,该描述说它没有排序。出于我的目的,有必要对大文件进行完全排序,而不仅仅是本地排序的较小部分的串联。虽然我已经在小例子上测试过这个过程并且它似乎有效,但是手册让我对将它应用到我的实际情况缺乏信心,

要给出 MWE,请考虑我要排序的这个制表符分隔文件:

我尝试了以下操作:

这是一次对整个文件进行排序时的“正确”解决方案(这在我的实际用例中是不可行的)。

如果我尝试将文件分成几部分,然后立即使用 -m 选项,则会得到不正确的结果:

看起来已经发生的是,gnu sort 刚刚考虑了两个单独的部分,并根据彼此的第一个值对它们进行了排序。因此,它在这个成品中将第二块放在了第一位,但没有进行其他排序。

或者,如果我遵循此处提倡的程序(在 pandas 中对大型数据集进行排序),即首先对各个部分进行排序然后合并,我似乎确实得到了正确的结果:

对我来说,症结在于,如果片段文件很大,仍然需要进行大量计算才能将它们合并到一个正确排序的文件中。因此,我很难理解如何将如此重要的排序数量描述为声称它“不排序”的操作的结果。

谁能告诉我为什么手册会这样写?为什么以及如何确信 gnu sort 在使用 merge 选项时会可靠地执行它所声称的操作?手册文本是否以某种方式暗示了此过程无法达到预期结果的某些情况?