2

我有一个带有矩阵的 14 MB 文件,采用原始二进制格式。我想啜饮它并拥有类似数组的东西,所以我可以读取一些值。我希望找到一些神奇的 Perl 模块,考虑到矩阵的大小,它可以为我完成所有工作:)

但我找不到它,我怀疑我只是错过了一种更明显的方法。PDL::IO::FlexRaw 接近我需要的,尽管我对 F77 添加的奇怪字符的警告有点困惑。

矩阵是二进制文件,原始格式,64 位浮点数。二进制文件的前 8 个字节是矩阵 (1,1) 的第一个“单元”。接下来的八个字节是第二个单元格 (2,1)。它没有页眉和页脚。我知道它的尺寸,所以我可以告诉模块“我每 64000 个字节就有一行”。

我正在查看 tie::mmapArray,但我不知道我是否可以使它工作。也许我更好地使用 lseek() 来回找到我需要的八个字节,然后 unpack() 它?

最好的方法是什么?

4

3 回答 3

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。

于 2009-03-19T19:53:06.030 回答
0

在不知道文件结构的情况下,任何图书馆都希望阅读它吗?如果它是某种标准化的矩阵二进制格式,那么您可以尝试搜索CPAN。否则,我猜你将不得不自己做这项工作。

假设它不是稀疏矩阵,可能只是读取维度,然后读取适当大小的块。

于 2009-03-19T18:28:27.187 回答
0

看看packunpack(尤其是 unpack)可能会让你走上正轨,看看 b 格式。

于 2009-03-19T18:24:42.670 回答