27

私が取り組んでいるプロジェクトの場合、同じ結果を返すために計算を信頼できる(そして副作用がない)状態がいくつかあります。明らかな解決策は、コストのかかるすべての機能にメモ化を使用することです。

複数の状態を処理するメモ化が必要になります(別のキャッシュセットを無効にせずに1つのキャッシュセットを無効にできるようにするため)。誰かがこの種のもののための良いCライブラリを知っていますか?(C ++にすることはできません。Cについて話していることに注意してください。)

私はPythonでいくつかの優れた実装を使用して、デコレータを使用してさまざまな関数を柔軟にメモできるようにしました。Cで同様のことを実行できる汎用ライブラリがあるのではないかと思います(ただし、便利な構文ではなく明示的な関数ラッピングを使用している可能性があります)。それが十分に一般的な問題である場合、各関数に個別にキャッシュを追加しなければならないのはばかげていると思います。それに対するいくつかの既成の解決策が必要です。

私が探している特徴は次のとおりです。

  1. さまざまなタイプの入力と出力で関数をキャッシュできます
  2. 複数の異なるキャッシュを管理します(したがって、短期および長期のキャッシュを使用できます)
  3. キャッシュを無効にするための優れた機能があります
  4. 既存の関数を変更するのではなく、関数をラップすることによって使用されることを目的としています

これらの必要条件のすべてまたはほとんどを処理できるC実装を知っている人はいますか?

4

3 に答える 3

11

さて、C 用のメモ化ライブラリがなく、コード ベースで既存の C 関数をメモ化するためのドロップイン ソリューションを探していたので、APL 2.0 でリリースする独自の小さなメモ化ライブラリを作成しました。うまくいけば、人々はこれが便利で、他のコンパイラでクラッシュしたり燃えたりしません。問題がある場合は、ここにメッセージを送信してください。時間があればいつでも調査します (おそらく月単位で測定されます)。

このライブラリは速度を重視して構築されたものではありませんが、動作し、使用するのがかなり簡単で、私のテストでメモリ リークが表示されないことを確認するためにテストされています。基本的に、これにより、Python で慣れ親しんだデコレータ パターンと同様のメモ化を関数に追加できます。

ライブラリは現在C-Memo Libraryとして SourceForge にあります。これには、小さなユーザー マニュアルと、ジェネリック ハッシュ用のサード パーティの寛容にライセンスされたライブラリがいくつか付属しています。場所が変更された場合は、このリンクを更新しようとします。これは自分のプロジェクトに取り組む際に役立つことがわかりました。他の人が自分のプロジェクトに役立つことを願っています。

于 2011-10-21T07:50:52.050 に答える
1

メモ化は Haskell 言語に組み込まれています。この機能は c から呼び出すことができます

更新:
私はまだ関数型プログラミングについて学んでいますが、関数型プログラミングではメモ化がかなり一般的であることを知っています。これは、言語機能により簡単になるからです。私はf#を学んでいます。Haskell については知りませんが、c とやり取りできる関数型言語として私が知っているのは Haskell だけです。Haskell が提供するものよりも適切な方法で c とやり取りする別の関数型プログラミング言語を見つけることができるかもしれません。

于 2011-05-22T03:47:59.783 に答える