perl – 读取50GB文件(并将其重写为16K文件)的建议!
发布时间:2020-12-16 06:14:21 所属栏目:大数据 来源:网络整理
导读:我有一个巨大的文件(接近50GB,只有一个由360K行组成的ASCII矩阵,每行有15K个数字),我需要转置它.为了避免在内存中读取整个内容,我只编写了一个打开15K文件的Perl脚本(矩阵的每一列一个),然后读取输入文件的完整行,并将每个数字写入其结尾相应的文件(输出文件
我有一个巨大的文件(接近50GB,只有一个由360K行组成的ASCII矩阵,每行有15K个数字),我需要转置它.为了避免在内存中读取整个内容,我只编写了一个打开15K文件的Perl脚本(矩阵的每一列一个),然后读取输入文件的完整行,并将每个数字写入其结尾相应的文件(输出文件column0.txt的第一个数字,输出文件column1.txt的第二个数字等).
事情看起来很有希望:代码只使用一个恒定的178MB内存并且只有部分输入文件的初始测试运行得很好:它在大约一分钟内处理了3600行,所以我希望能在大约两个小时内完成所有工作,但是当我运行真实的东西时,代码会在许多点停止.例如,在开始时它很快就处理了~4600行,然后停止了很长一段时间(可能是5-10分钟),然后再继续.现在,经过约10个小时的计算,它处理了131K行,处理300-400行后代码停止了2-3分钟. 我从来没有使用过这么大的输入文件或那么多打开的文件,所以我不确定问题是输入还是文件描述符的数量.关于如何诊断(并希望)解决速度问题的任何建议?我在下面列出了该计划的相关部分 谢谢 ================================== for ($i=0 ; $i<$columnas ; $i++) { $column[$i] = IO::File->new(">column$i.txt") or die $!; } while (<DATA>) { chomp; $cols = split; for ($col=0 ; $col<$cols ; $col++) { print { $column[$col] } "$_[$col] " ; } } close (DATA) or die $!; 解决方法
检查/ proc / sys / fs / file-max以查看最大打开文件数. 您可能需要使用搜索来读取文件,以便您可以控制打开文件的数量以进行相应的读取. 最好的方法是缓存x行,然后附加到所有文件.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |