Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 当我只有2GB内存时,是否可以加载或处理10GB文件?_File_Sorting_Large Files - Fatal编程技术网

File 当我只有2GB内存时,是否可以加载或处理10GB文件?

File 当我只有2GB内存时,是否可以加载或处理10GB文件?,file,sorting,large-files,File,Sorting,Large Files,给定一个满是名称的10GB文件,任务是对该文件进行排序,而系统只有2GB的RAM。你打算怎么做 是否可以使用2GB RAM加载或处理10GB文件?解决方案是将文件分成适合内存的部分,对这些部分进行单独排序并将其写入临时文件,然后合并临时文件 有关更详细的说明,请参阅Wikipedia上的文章 作为记录,使用虚拟内存的解决方案不会扩展。除非仔细设计排序算法,否则系统将陷入灾难性的虚拟内存波动 对压缩文件进行排序也不起作用 是否可以使用2GB RAM加载10GB文件 将其解释为一个一般性问题,答

给定一个满是名称的10GB文件,任务是对该文件进行排序,而系统只有2GB的RAM。你打算怎么做


是否可以使用2GB RAM加载或处理10GB文件?

解决方案是将文件分成适合内存的部分,对这些部分进行单独排序并将其写入临时文件,然后合并临时文件

有关更详细的说明,请参阅Wikipedia上的文章


作为记录,使用虚拟内存的解决方案不会扩展。除非仔细设计排序算法,否则系统将陷入灾难性的虚拟内存波动

对压缩文件进行排序也不起作用


是否可以使用2GB RAM加载10GB文件

将其解释为一个一般性问题,答案是否定的。如果您有一个需要(明显)比您更多RAM的问题,那么您需要采用一种算法,将问题划分为更小的问题。如果你找不到一个这样工作的算法,那你的日子就不好过了

是否可以使用2GB RAM处理10GB文件


是的。。。前提是您的处理不需要同时在内存中保存整个10GB文件

我不知道这是否有帮助,但使用这种语言,您可以处理比系统RAM大得多的文件,这意味着

仅当列表中的元素(字符)为 处理。由于字符串的元素不再使用,Haskell的垃圾 收集器会自动释放该内存


Bryan O'Sullivan、Don Stewart和John Goerzen在他们的书中解释了这是如何做到的。

根据对原始问题的评论,这是一个10GB的文件,包含名称的单行。这可以通过使用轻松实现,几乎每个Linux系统上都应该有:

sort yourFile
现在,如果文件包含格式为
FirstName LastName
的名称,那么这将首先按名称对文件进行排序,这可能不是您想要的。在这种情况下,您必须告诉sort您要按第二个字段排序(特殊情况下为后续字段):

接下来,您要确保忽略大小写(在拼写错误或特殊姓氏的情况下),并且我们有一个与字典中使用的排序顺序相等的排序顺序。前者使用
-f
标志实现,后者使用
-d
标志实现:

sort -k 2 -f -d yourFile
最后但并非最不重要的一点是,您可能希望将结果写入文件,这可以使用
-o
标志来完成(出于好奇:我发现这比使用
的输出重定向更快):


至于RAM的使用:我还没有测试过它,但据我所知,它应该不会超过1Mb。但是,可能需要很长时间才能得到结果。

您能告诉我们文件的结构吗?据我所知,你想把它分类。根据文件类型的不同,使用几乎所有现代Linux系统上的工具都可以轻松地完成这项工作。请相应地编辑您的问题。它只是一个带有名称的纯文本文件。每行一个名称。我从文本和标记中删除了Linux,因为它们似乎与问题无关——我认为这是(或应该是)关于使用的算法,而不是特定的操作系统。在64位系统上,您甚至可以加载它。。。(使用大量的交换空间)(内存映射文件可能是一个更好的主意(使用正确的选项,操作系统将只在需要时将部分加载到内存中)…(
mmap
是在大多数类似Unix的系统上执行此操作的方法))。在32位系统上,您可能必须直接对文件的相关部分进行操作,而无需尝试将所有内容作为变量立即访问。。。(读、找、写、重复——简单的方法可能会慢一些)嗯。。。我原以为这样仍然可以将整个文件加载到内存中,但事实证明你是对的:
sort
使用一个函数并加载整个文件。@ostrokach我对文件进行了排序,远远超出了相应机器的内存限制。有时候,经验就是你所需要的一切;)
sort -k 2 -f -d yourFile
sort -k 2 -o sortedFile -f -d yourFile