我有一个巨大的文件(接近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 $!;