2

これはよくある状況だと思いますが、グーグルで満足のいく答えを見つけることができませんでした。

質問:データベースからの列挙値の検索に対処するパターンはありますか?

状況:私は、メモリ使用量が非常に多くなっている Winforms アプリのリファクタリングを任されています。主な原因は「定数」プロジェクトです。基本的には一連の Enum クラスです。それらの目的は、データベース ルックアップ テーブルの値を複製することです (以下の例を参照)。

    public enum Status
    {
        None = -1,
        Active = 0,
        Completed = 1,
        Review = 2,
        Proceed = 3
    }

これらの列挙型はすべて、アプリが読み込まれるたびにメモリに読み込まれる必要があります。この問題を修正できるが、クエリでデータベースを強制終了しないパターンはありますか?

4

1 に答える 1

1

s のアセンブリが実際に高いメモリ使用量の主な原因であるとは信じがたいですがenum(そのアセンブリの SIZE は想像したくありません)、考えられる解決策がいくつか思い浮かびます。

  1. enums以外のものについて、メモリを貪欲なアセンブリを探索しますenum。はい、それは些細なアドバイスですが、結局のところ最も合理的であることがわかります。
  2. enumアセンブリをメイン プロジェクトとマージします。s 自体はほとんどenumメモリを消費しませんが、関連付けられた特大のアセンブリはすべて単独で消費される可能性があります (たとえば、属性を頻繁に使用するため)。
  3. 必要な値を、一連のフィールド (s ではない)staticで満たされた一連の不要なクラスで実装します。それらすべてが少なくとも 1 回呼び出された場合、メモリ使用量はほとんど減りませんが、ユーザーのアクションによってはいくらかの削減につながる可能性があります。ただし、これらの厄介なs は s よりも説明が難しくなります。public static readonly intconstintenum
  4. キャッシュされたシングルトンっぽいパターンで必要な値を実装します (おそらくそのようなパターンの名前はありますが、私はそれに慣れていません)。インスタンスごとにメモリを消費するのは明らかに難しくなりますが、(GC に依存しながら) 使用法に基づいてメモリを有効にしたり、消したりすることができます。基本的に、それは次のようなものでなければなりません

    internal abstract class ErzatsEnumBase {
        protected static readonly ObjectCache Cache = MemoryCache.Default;
        protected ErzatsEnumBase ( string CacheKey, CacheItemPolicy CachePolicy ) {
            Cache.Add ( CacheKey, this, CachePolicy, null );
        }
    }
    public sealed class ErzatsEnum: ErzatsEnumBase {
        private static CacheItemPolicy policy = new CacheItemPolicy () {
            AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration,
            SlidingExpiration = new TimeSpan ( 0, 15, 0 )
        };
        private ErzatsEnum ( string CacheKey )
            : base ( CacheKey, policy ) {
        }
        public ErzatsEnum Instance1 {
            get {
                ErzatsEnum result = ErzatsEnumBase.Cache.Get ( "Instance1" );
                if ( result == null )
                   result = new ErzatsEnum ( "Instance1" );
                return result;
            }
        }
        public ErzatsEnum Instance2 {
            get {
                ErzatsEnum result = ErzatsEnumBase.Cache.Get ( "Instance2" );
                if ( result == null )
                   result = new ErzatsEnum ( "Instance2" );
                return result;
            }
        }
    }
    

それのいくつかが役に立つことを願っています:)

于 2013-09-27T19:53:22.693 に答える