perl – 读取50GB文件(并将其重写为16K文件)的建议!

前端之家收集整理的这篇文章主要介绍了perl – 读取50GB文件(并将其重写为16K文件)的建议!前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个巨大的文件(接近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行,然后附加到所有文件.

猜你在找的Perl相关文章