- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个包含数百万行的巨大 CSV 文件。每行都有一个时间戳,我可以用来对其进行排序。
所以,我的第一个方法显然是通过将其放入内存然后排序来读取整个内容。它并没有像您猜想的那么好......
我的第二个尝试是遵循 MapReduce 背后的想法。
所以,我会将这个巨大的文件分成几个部分,然后对每个部分进行排序。然后我会将所有部分合并到最终文件中。
这里的问题是B部分可能有一条消息应该在A部分。所以最后,即使每个部分都是有序的,我也不能保证最终文件的顺序....
我的目标是创建一个函数,当给定这个巨大的无序 CSV 文件时,可以创建一个具有相同信息的有序 CSV 文件。
订购这么大的数据集的流行解决方案/算法是什么?
最佳答案
What are the popular solutions/algorithm to order data sets this big?
由于您已经得出结论,数据太大而无法在您可用的内存中进行排序/操作,因此流行的解决方案是一个数据库,该数据库将构建基于磁盘的结构来管理和排序比内存中更多的数据.
您可以构建自己的基于磁盘的方案,也可以使用已经完全开发、优化和维护的方案(例如流行的数据库)。您询问的“流行”解决方案是使用数据库来管理/排序大型数据集。这正是它们的构建目的。
数据库
您可以设置一个由您的排序键索引的表,将所有记录插入数据库,然后创建一个按您的键排序的游标并迭代游标,将现在排序的记录一次写入您的新文件时间。然后,完成后删除数据库。
分块内存排序,手动合并
或者,您可以进行分块排序,将数据分成可放入内存的较小片段,对每个片段进行排序,将每个排序后的 block 写入磁盘,然后合并所有 block 并读取下一条记录从每个 block 到内存中,从所有 block 中找到最低的一个,将其写入最终输出文件,从该 block 读取下一条记录并重复。使用此方案,合并一次只需要在内存中有 N 条记录,其中 N 是您拥有的已排序 block 的数量(可能少于原始分块 block 排序)。
正如 juvian 提到的,这里概述了像这样的“外部排序”是如何工作的:https://en.wikipedia.org/wiki/External_sorting .
分块内存排序的一个关键方面是确定分块的大小。有许多策略。最简单的方法可能是根据一些简单的测试或什至只是猜测您确定是安全的(一次选择较小的数字来处理就意味着您将将数据拆分到更多文件中)。然后,只需将那么多记录读入内存,对它们进行排序,然后将它们写入已知文件名。重复该过程,直到您读取了所有记录,然后所有记录都位于磁盘上具有已知文件名的临时文件中。
然后,打开每个文件,从每个文件中读取第一条记录,找到您读入的每个记录的最低记录,将其写入最终文件,从该文件中读取下一条记录并重复该过程。当你到达一个文件的末尾时,只需将它从你正在比较的数据列表中删除,因为它现在已经完成了。当没有更多数据时,您就完成了。
仅在内存中对键进行排序
如果所有排序键本身都适合内存,但关联数据不适合,那么您可以创建自己的索引并对其进行排序。有许多不同的方法可以做到这一点,但这里有一个方案。
通读整个原始数据,为每条记录将两件事捕获到内存中,排序键和存储该数据的原始文件中的文件偏移量。然后,一旦内存中有所有排序键,就对它们进行排序。然后,一个一个地遍历排序的键,寻找文件中的写入点,读取该记录,将其写入输出文件,前进到下一个键并重复,直到每个键的数据按顺序写入。
BTree 键排序
如果所有的排序键都不适合内存,那么你可以得到一个基于磁盘的 BTree 库,它可以让你对大于内存的东西进行排序。您将使用与上述相同的方案,但您会将排序键和文件偏移量放入 BTree 中。
当然,将文件中的实际数据本身放入 BTree 中只是更进一步,然后您就拥有了一个数据库。
关于javascript - 如何订购巨大(GB 大小)的 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50471893/
#include typedef std::vector vc; typedef std::vector vvc; vvc f() { const int N = (1 不把它还给操作系统。 因
我正在尝试训练 Dlib's train_shape_predictor_ex.cpp与 Halen数据集。我在 Release模式 中使用 Visual Studio 将代码编译为 64 位平台 作
当我试图解决this 时想到了这个问题。问题。 我有一个容量为 120 GB 的硬盘,其中 100 GB 被一个巨大的文件占用。所以 20 GB 仍然是免费的。 我的问题是,我们如何将这个巨大的文件拆
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Can you allocate a very large single chunk of memory (
我有一台运行 Linux (3.19.5-200.fc21.x86_64) 的 128 GB RAM 的计算机。但是,我不能在单个进程中分配超过 ~30 GB 的 RAM。除此之外,malloc 失败
我需要为 808704000 个 float 分配内存,大约是 3085 MB。我的电脑有 32 GB 内存,运行 64 位 Linux (CentOS 6.6)。每次我尝试分配内存时,malloc
很抱歉这个愚蠢的问题,但是当reading about 32 bits limitation ,我发现由于 Memory-Mapped 方法,MongoDB 不能存储超过 2 GB,但是: 2^32
假设我们有一个 32 位地址,那么每一位可以是 1 或 0。 所以组合总数等于2^32。 所以我们可以表示 2^32 个地址(没有单位)。 但为什么人们说 32 位地址可以表示 2^32 字节地址(为
好吧,这个问题确实是一个挑战! 背景 我正在从事一个涉及比正常数字更大的基于算术的项目。我是新手,我打算使用 4 GB 文件大小的最坏情况(我什至希望将其扩展到 5GB 上限,因为我之前看到文件大小大
我在文件系统上有大约 12 个大小为 1 GB 到 10 GB 的存储库,我需要为所有这些存储库设置自动备份(我们的旧备份脚本在计算机出现故障时丢失了) XP 64 位机器。 看完this quest
我尝试调整 Linux VM 上的操作系统磁盘大小,该 VM 通常由 azure 自动创建。我无法创建自定义操作系统磁盘 - 请告知我该怎么做? enter image description her
我在 .NET 中遇到了一个问题,我的数组受到我拥有的 RAM 数量的限制,并且我需要可以容纳至少 40 GB 字节的数组。我正在考虑使用硬盘驱动器作为虚拟数组的想法不在乎它是否慢。 我正在研究这个想
我尝试调整 Linux VM 上的操作系统磁盘大小,该 VM 通常由 azure 自动创建。我无法创建自定义操作系统磁盘 - 请告知我该怎么做? enter image description her
我的目标是看看当使用比物理 GPU 内存所能容纳的更多纹理数据时会发生什么。我的第一次尝试是加载多达 40 个 DDS 纹理,导致内存占用比 GPU 内存高得多。但是,我的场景在 9500 GT 上仍
Windows 上的 JDK 最多需要 2 GB 左右的 RAM。即使我们为 JDK 分配更多 RAM;它不接受它。如果我需要在 Windows 上运行需要 8 GB RAM 的进程;我怎样才能实现它
我有一个程序需要分配2个15亿长度的整数数组。这是一个编码挑战( https://projecteuler.net/problem=282 ),并且没有办法使用如此大的数组(如果有,请不要告诉我;我应
假设我有一个 32 位内核。 4 Gb RAM,10 Gb 交换分区。 我有一个在无限循环中有 malloc 的进程。因此,最终系统的 OOM 将终止该进程。这里有两个论点。 参数 1:因为它是 32
我有一个可以大于 4GB 的文件。我正在使用 linux split 命令按行拆分它(这是要求)。但是拆分原始文件后,我希望拆分文件的大小始终小于 2GB。原始文件大小可能在 3-5 GB 之间。我想
我有一台带有 32GB RAM 的 Mac 服务器(雪豹)。当我尝试在 Perl (v 5.10.0) 中分配超过 1.1GB 的 RAM 时,出现内存不足错误。这是我使用的脚本: #!/usr/bi
我们正在尝试运行.NET 4 Web应用程序(在8 GB,8核心Windows 2008 R2 64位Webedition服务器上),该应用程序使用Spire.doc创建Word mailmerge文
我是一名优秀的程序员,十分优秀!