我有一个带有矩阵的14 MB文件,采用原始二进制格式。我想啜饮它并拥有类似数组的东西,所以我可以阅读一些值。我希望找到一些神奇的Perl模块,考虑到矩阵的大小,我会为我做所有的工作:)
但我找不到它,我怀疑我只是错过了一种更明显的做法。 PDL :: IO :: FlexRaw接近我的需求,虽然我对F77添加的奇怪字符的警告感到有点困惑。
矩阵是原始格式的二进制文件,64位浮点数。二进制文件的前八个字节是矩阵的第一个“单元”,(1,1)。接下来的八个字节是第二个单元,(2,1)。它没有页眉也没有页脚。我知道它的尺寸,所以我可以告诉模块“我每64000字节有一行”。
我正在看tie :: mmapArray,但我不知道我是否可以使它工作。也许我最好来回使用lseek()找到我需要的八个字节,然后解压()它?
这样做的最佳方式是什么?
答案 0 :(得分:1)
除非你内存紧张,否则只需阅读整个文件。
$size = -s $filename;
open(DATA, $filename);
sysread DATA, $buffer, $size;
@floats = unpack("d*", $buffer);
$float2x1 = $floats[ 2 + (1-1)*$width ];
应该访问(2,1)。 (我没有测试它,但是......)
编辑:
好的,低内存版本:
use Sys::Mmap;
new Sys::Mmap $buffer, -s $filename, $filename or die $!;
$float2x1 = unpack("d", substr($buffer,8*( (2-1) + (1-1)*$width ),8));
只需要CPAN的Sys :: Mmap。
答案 1 :(得分:0)
答案 2 :(得分:0)
在不知道文件结构的情况下,任何图书馆都希望如何阅读它?如果它是某种标准化矩阵二进制格式,那么您可以尝试搜索CPAN。否则,我猜你自己必须做这项工作。
假设它不是sparse matrix,它可能只是读取尺寸,然后读取适当大小的块。