2

生のバイナリ形式の行列を含む 14 MB のファイルがあります。私はそれを丸呑みして配列の配列のようなものを持ちたいので、いくつかの値を読み取ることができます。マトリックスのサイズを考えると、私のためにすべての作業を行う魔法のPerlモジュールを見つけたいと思っていました:)

しかし、私はそれを見つけることができず、それを行うためのより明白な方法を見逃していると思われます. PDL::IO::FlexRaw は私が必要としているものに近いですが、F77 によって追加された奇妙な文字の警告について少し混乱しています。

マトリックスはバイナリ ファイルで、生の形式で、64 ビット浮動小数点数です。バイナリ ファイルの最初の 8 バイトは、行列の最初の「セル」(1,1) です。次の 8 バイトは、2 番目のセル (2,1) です。ヘッダーもフッターもありません。私はその次元を知っているので、モジュールに「64000 バイトごとに行がある」と伝えることができます。

私はtie::mmapArrayを見ていますが、それを機能させることができるかどうかわかりません。lseek() を前後に使用して、必要な 8 バイトを見つけてから 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

パックアンパック(特にアンパック)を見ると、正しい方向に進む可能性があります。b形式を見てください。

于 2009-03-19T18:24:42.670 に答える
0

ファイルの構造を知らなくても、どの図書館もそれをどのように読みたいと思うでしょうか。ある種の標準化されたマトリックスバイナリ形式の場合は、CPANで検索してみてください。そうでなければ、あなたは自分で仕事をしなければならないと思います。

それがスパース行列ではないと仮定すると、それはおそらく次元を読み取り、次に適切なサイズのブロックを読み取るだけの問題です。

于 2009-03-19T18:28:27.187 に答える