2

この StackOverflow の質問に触発されて、.comに関するベスト プラクティスについてコミュニティに質問したいと思いBinaryます。Hyperedges の大きなリスト (単純な代数データ構造) がストリーミングされず、一度に読み込まれることに気付いたとき、10000 要素のチャンクを使用するmyGetand関数を作成しました。myPut上記の StackOverflow の質問への回答で述べたように、私の実装は Binary >= 0.5 では機能しません。(私は逃しました。)

ただし、私が気づいたことは、型パラメーターを使用して をロードHyperedgeIntているときに、後で変換するためだけに多くの とが割り当てられたことです。それは大規模なスペースリークでした。ご覧のとおり、できるだけ早く適用するように「修正」しました。おそらく を使用した、より洗練されたアプローチを好むでしょうが、戦略は追加のパラメーターである必要があるため、型クラスを使用できなくなりました。Int32Word32Word64deepseqgetStrategyBinary

まとめ:今、めちゃくちゃです。「ベストプラクティス」のアドバイスを提供できますか?

instance (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v)
  => B.Binary (Hyperedge v l i) where
  put e = do
    B.put (to e)
    B.put (from e)
    B.put (label e)
    B.put (ident e)
  -- get = mkHyperedge <$> B.get <*> B.get <*> B.get <*> B.get
  get = do
    x1 <- B.get
    x2 <- x1 `deepseq` B.get
    x3 <- x2 `deepseq` B.get
    x4 <- x3 `deepseq` B.get
    x4 `deepseq` return (mkHyperedge x1 x2 x3 x4)


myGet
  :: (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v) 
  => B.Get [Hyperedge v l i]
myGet = do
  es1 <- B.get
  if null es1
    then return []
    else
      do
        es2 <- myGet
        return (es1 ++ es2)

myPut
  :: (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v) 
  => [Hyperedge v l i] -> B.Put
myPut es@[] = B.put es -- ([] :: [Hyperedge v l i])
myPut es = do
  B.put (take 10000 es)
  myPut (drop 10000 es)
4

0 に答える 0