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