2017-01-22 10 views
2

ファイルに含まれているサンプルデータを解析するプログラムを作成しました。現在、私のプログラムはサンプルをリストに読み込み、サンプルリスト([Float])でさらに分析/処理を実行します。サンプルをファイルから配列に読み込む

私はパフォーマンスに満足していません。パフォーマンス向上のためにリストの代わりに配列を使用することを考えています。私は実装を並列化することも検討しており、Data.Array.Repaは有望に見えます。

現在、ファイルからの読み込みは、このような何かを行く:

  1. 私はhGetを使用して、ByteStringにすべてのサンプルをお読みください。
  2. 私は、各サンプルは3バイトで表現されて知っているので、私はグループ
  3. 3のByteString秒のリストにByteString私はFloatのリストを取得するにはByteString秒のリストに私のtoFloat機能をマッピングします。

この結果、[Float]という結果が得られ、目的の情報が得られます。

この手順のどの段階でアレイを使用するのかと思います。最初にlistArray関数を使用して[Float]を浮動小数点数の配列に変換することを考えました。私は分かりませんが、これは最も効率的な方法ではないようです。

Data.Array.Repa.fromFunctionを使用して、手順2の直後に配列を作成し、中間をスキップできますか?関数については、(map toFloat bsList)のようなものを使用できますか?ここで、bsListは、グループ化後のByteStringのリストです。

または、サンプルを直接アレイに読み込む方法はありますか?

+1

プログラムが小さい場合は、投稿することもできます。私たちの答えははるかに具体的(そして検証可能)になります。 – Alec

+0

@Alec申し訳ありませんが、コードを共有することはできません。 –

答えて

1

実際には、Repaは配列のバックエンドとしてByteStringで操作できます。したがって、これらの行に沿って何かを試して、ByteStringの処理を並行して開始することができます:

#!/usr/bin/env stack 
-- stack runghc --package repa 

import Data.ByteString as BS 
import Data.Array.Repa as R 
import Data.Array.Repa.Repr.ByteString as R 

getFloatsArr :: ByteString -> Array D DIM1 Float 
getFloatsArr bs = R.traverse strArr (\(Z :. n) -> Z :. (n `div` 3)) getFloat where 
    strArr = R.fromByteString (Z :. BS.length bs) bs 
    getFloat getWord8 (Z :. k) = 
    toFloat (getWord8 (Z :. k*3)) (getWord8 (Z :. k*3+1)) (getWord8 (Z :. k*3+2)) 
    toFloat = undefined -- convert to `Float` from 3 `Word8`s 

processFurther :: Array U DIM1 Float -> a 
processFurther = undefined 

main :: IO() 
main = do 
    bs <- BS.readFile "file.txt" 
    arr <- R.computeUnboxedP $ getFloatsArr bs 
    processFurther arr 
    return() 
関連する問題