2015-09-16 13 views
5

私はFFIからCまでの大量のデータ(〜100MB)をCプログラムに送ります。文字列のリストだけです。しかし、私が使用した方法のすべては、不合理な時間(約10秒)かかると思われます。プロファイリングすると、時間がかかる実際のメモリ割り当てのように見えます。私が試した:Haskell FFIメモリ割り当てパフォーマンスの問題

  • は、通常の文字列としてバイト文字列に(newCString
  • 変換文字のベクトル(unsafeWith >>= withForeignPtr ...

最速の方法にはどのようなものですから(unsafeUseAsCString

  • 変換を送りますC FFIを介してデータを送信しますか?

  • +4

    これらの文字列の長さはどれくらいですか?どれくらい?問題を再現する小さな例を提供できませんか? – Bakuriu

    +2

    あなたのデータはどのように表現されていますか? –

    +0

    これは5つのフィールドを持つ標準型です。私はCのデータベースクライアントに渡すために文字列に/から変換しています。さらにmallocBytesを使って一度にすべてを割り当てようとしましたが、それほど遅いようです。もう1つのデータポイントは、GHCのプロファイリングでは〜100MBのデータセットに対して〜15GBが割り当てられているということでした。 – ooblahman

    答えて

    0

    Reid Bartonがコメントで言ったように、100MBの文字列があれば、あなたが何をしていても、あなたの割り当てはひどくなります。

    あなたのスローダウンは、FFIのものではなく、100MBの文字列から始まるものではありません。

    0

    newAlignedPinnedByteArrayで割り当てられたMutableByteArrayを使用してカスタムデータ型を作成し、mutableByteArrayContentsでCに渡すことができるものに変わっているのがおそらくあります。

    あなたが接続しているC APIを書き直すことができるのであれば、C関数にFunPtrを与えて、一度に扱うHaskellデータの妥当なサイズのチャンクを渡すことです。

    関連する問題