2009-02-20 17 views
5

私は現在、ランダムバイナリファイルのアクセスに使用されるDelphiのメソッドをJavaに変換しています。 Delphiのプロシージャは以下を使用します。バイトの配列を浮動小数点の配列に変換する

TSingleArray = Array[0..MAXSIZE] of Single 
... 
procedure GetLinkValues(const LinkVar: Integer; const TimePeriod: Integer; var Value: PSingleArray); 
... 
BlockRead(Fout, Value^, Nlinks*SizeOf(Single)); 

単一の配列にバイトの配列を読み込む。配列を反復せずにJavaでこれを行う方法は同じですか?

私は現在

List<Float> l = new ArrayList<Float>(); 
… 
for (int i = 0 ; i < nLinks ; i++) 
l.add(resultsFile.readFloat()); 

を使用しています。しかし、私はスピードが心配です。エンディアンは問題ではありません。

答えて

8

コードをプロファイリングして実際に問題が見つかりましたか? 何かはループする必要があります...これはあなたのコードのボトルネックであると本当に確信していますか?

これまで述べてきたように、私はあなたが望んでいると思われるFloatBufferを使用できるはずです。残念ながら、SunのJavaDocはダウンしていますので、すぐにドキュメントにリンクすることはできません。

FloatBufferを使用するには、あなたはおそらくしたいと思います:

  • は(FileInputStream.getChannel付きなど)、ファイルに関連付けられているのFileChannelを作成
  • ラップFloatBufferを作成したByteBuffer
  • を作成します。 FloatBuffer
  • から読むFileChannel.readでのByteBufferに読み込む(ByteBufferの)
  • ByteBuffer.asFloatBuffer
  • でのByteBuffer、

私は特にjava.nioに慣れていない/快適ではないので、希望これはすべて正しいですが、かなり面倒なことがあります。あなたの現在のループはほぼ確実に簡単ですので、最初のパフォーマンスを確認することを強くお勧めします。現在のFileInputStreamをBufferedInputStream、btwにラップしたいかもしれません。最終的なコードは次のようになりますジョンによって提供されるヘルプに基づいて

+1

私のために働く、少なくとも私が試した3回目。 http://java.sun.com/javase/6/docs/api/java/nio/FloatBuffer.html –

+0

まだダウンしています。私はそれがネットスプリットでなければならないと思う... –

+0

私はそれは答えがノーであることを意味すると思います。私が探していたのは、Javaでのポインタ操作を複製する方法でした。単純な配列(float)にバイトを埋め込みました。後で私はmyArray [n]を使って値を読み取ることができます – GrahamA

3

: - それはあなた自身であるか、または内部バッファコピー方法/操作内部

byte[] bt = new byte[nLinks * 4]; 
List<Float> l = new ArrayList<Float>(); 
if (linkVar != 0 && timePeriod < nPeriods) { 
    long p1 = RECORDSIZE * (nNodes * NODEVARS + nLinks * LINKVARS); 
    long p2 = RECORDSIZE * (nNodes * NODEVARS + nLinks * (linkVar - 1)); 
    long p3 = offset2 + (timePeriod * p1) + p2; 
    resultsFile.seek(p3); 

    resultsFile.read(bt, 0, nLinks * 4); 
    ByteBuffer bb = ByteBuffer.wrap(bt); 
    bb.rewind(); 
    bb.asFloatBuffer().get(values); 
} 
0

常にあり、どこかのループになります。それを超えて高速化する唯一の方法は、ベクトル操作をサポートするハードウェアとコンパイラを見つけることです。

関連する問題