0

データ ストアで一連のレコード/ドキュメントを実行できるようにしたいのですが、それらのレコードを常に RAM に最新の状態で保持したいと考えています。約 1.5GB から 2GB の RAM を使用するだけで済みます (潜在的にはそれ以下)。これは、組み込みではなくサーバーベースになります。

豊富なクエリ機能が必要なため、メモリ内のキーと値のストアが機能しないことはわかっています。

MySQL がメモリベースのテーブルを実行できることは知っていますが、私が考えていることに人々がこの機能を使用するかどうかはわかりません。SQL Server はテーブルをメモリに固定できますか? テーブル全体?

他にどのようなデータ ストアを確認する必要がありますか? Map/Reduce スタイルのクエリも、高速であれば問題ありません。

4

4 に答える 4

1

データをオブジェクトのコレクションとして表すことができる場合は、Linqを「リッチクエリ」機能として使用し、すべてをメモリ内で実行できます。これは、他のほとんどすべてのデータベースソリューションよりもはるかに高速です。すべてのデータをメモリに保持できる場合は、データベースを気にしないでください。

注:.NETでこれを行う場合は、32ビットアプリケーションのRAMに最大1.5 GBを超えるデータを含むコレクションを作成できないため、プロジェクトを64ビットモードでビルドする必要があります。64ビットモードでビルド/実行できない場合は、データベースが必要になる可能性があります。

アップデート

私はあなたが言っていることを私がフォローしているのかわかりません:私は普及しているシステムが何であるか本当にわかりません、そしてそれは私が普及しているシステムを使用していないと私に信じさせるでしょう。また、「自家製」オブジェクトとは何か、「自家製」.NETシステムとは何かもわかりません。私は標準の.NET4.0だけを使用しています。オブジェクトとは、データを保持できるクラスを作成することを意味します。そこから、データをメモリにロードし(ファイル、データベース、ネットワークなどのデータを取得する方法がわかりません)、LinqがORMを実行します。スレッドセーフは、オブジェクトの内部コレクションにアクセスしている場合にのみ重要であり、単純なロックでそれを行うことができます。

ああ、それが自家製の.NETシステムである場合、これらのオブジェクトはサーバーでホストされており、複数のクライアントに攻撃されていますか?

私が扱っているデータについては、(メモリ内にもデータベースからも取得するために)豊富なクエリ機能は必要ありません。そのため、メモリに収まらないものはすべて組み込みデータベースに格納します。 (LevelDB)。このようにして、すべてのデータがディスクに含まれ、必要なときに、最短/最速のルートでデータをメモリに取り込みます。ネットワークを経由すると速度が低下するだけなので、それは可能ですが、絶対に必要な場合にのみ実行してください(つまり、2GBのデータがローカルマシン以外のデータベースにあるという厳しい制約があります)。

于 2012-02-09T19:33:03.943 に答える
1

VoltDBは、高速 OLTP 用に最適化されたインメモリ ACID 準拠の SQL データベースです。64 ビット Linux または Mac OS X で動作し、オープン ソース コミュニティ エディションと複数言語のクライアント ライブラリを備えています。

「豊富なクエリ機能」と言うと、OLAP の使用例のように聞こえますが、クエリが基本的に複雑な場合は、VoltDB に適している可能性があります。ユースケースについて詳しく教えてください。

于 2012-02-09T20:49:36.100 に答える
1

SQLLite は、リレーショナル データベース ソリューションのメモリ内で実行できます。非リレーショナル データベースの場合、RavenDB はメモリ内で実行できます。

于 2012-02-09T17:11:05.040 に答える
0

ここでリリックに同意する必要があります。.Net 用語では、データにオブジェクトを使用し、LINQ を使用してそれらのコレクションをクエリすることは、豊富なクエリ言語を指先で使用しながら、求めていることを実行する最速の方法の 1 つでなければなりません。

コレクションのサイズが心配で、すべての情報をメモリに保持できる場合は、Memcachedなどのプロジェクトを参考にしてください。

アップデート

Linq を条件オブジェクトと共に使用して製品のリストを照会する例を作成しました (ただし、Linq から Sql へのデータテーブルは簡単に作成できます)。

まず製品クラスの例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Linq_Question
{
    public class Product
    {
        public enum Categories
        {
            CatOne,
            CatTwo,
            CatThree
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public Categories Category { get; set; }
        public decimal Price { get; set; }

    }
}

Product Criteria クラスの例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Linq_Question
{
    public class ProductCriteria
    {
        public Product.Categories? WhereCategoryIs { get; set; }
        public decimal? WherePriceIsGreaterThan { get; set; }
        public decimal? WherePriceIsLessThan { get; set; }
        public string WhereNameContains { get; set; }

        public ProductCriteria()
        {

        }
    }
}

リポジトリの例 - リストの使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace Linq_Question
{
    public class ProductRepository
    {
        private List<Product> products;

        public ProductRepository()
        {
            products = new List<Product>();
            products.Add(new Product() { Category = Product.Categories.CatOne, Id = 1, Name = "Product 1", Price = 100 });
            products.Add(new Product() { Category = Product.Categories.CatTwo, Id = 2, Name = "Product 2", Price = 120 });
            products.Add(new Product() { Category = Product.Categories.CatThree, Id = 3, Name = "Product 3", Price = 300 });
            products.Add(new Product() { Category = Product.Categories.CatOne, Id = 4, Name = "Product 4", Price = 400 });
            products.Add(new Product() { Category = Product.Categories.CatTwo, Id = 5, Name = "Product 5", Price = 500 });
            products.Add(new Product() { Category = Product.Categories.CatThree, Id = 6, Name = "Product 6", Price = 600 });
        }

        public IEnumerable<Product> Retrieve(ProductCriteria criteria)
        {
            return this.products.Where(FilterProducts(criteria));
        }

        private Func<Product, bool> FilterProducts(ProductCriteria criteria)
        {
            Expression<Func<Product, bool>> predicate = PredicateBuilder.True<Product>();
            List<IProductFilter> filters = new List<IProductFilter>();
            filters.Add(new PriceIsGreaterThanFilter());
            filters.Add(new CategoryFilter());

            foreach (var item in filters)
            {
                if (item.IsValidFilter(criteria))
                {
                    predicate = predicate.And(item.ApplyFilter(criteria));
                }
            }
            return predicate.Compile();
        }
    }
}

FilterProducts メソッドでは、フィルターのリストがループされ、現在の基準オブジェクトが与えられた場合に有効なフィルターであるかどうかがチェックされ、必要に応じて適用されることに注意してください。

IProductFilter インターフェイスといくつかのサンプル フィルターを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace Linq_Question
{
    public interface IProductFilter
    {
        bool IsValidFilter(ProductCriteria criteria);
        Expression<Func<Product, bool>> ApplyFilter(ProductCriteria criteria);
    }

    public class CategoryFilter : IProductFilter
    {
        public bool IsValidFilter(ProductCriteria criteria)
        {
            return (criteria.WhereCategoryIs.HasValue);
        }

        public Expression<Func<Product, bool>> ApplyFilter(ProductCriteria criteria)
        {
            return (p => p.Category == criteria.WhereCategoryIs.GetValueOrDefault());
        }
    }

    public class PriceIsGreaterThanFilter : IProductFilter
    {
        public bool IsValidFilter(ProductCriteria criteria)
        {
            return (criteria.WherePriceIsGreaterThan.HasValue);
        }

        public Expression<Func<Product, bool>> ApplyFilter(ProductCriteria criteria)
        {
            return (p => p.Price > criteria.WherePriceIsGreaterThan.GetValueOrDefault());
        }
    }
}

PredicateBuilder クラスが必要になることに注意してください - 見つかりましたhttp://www.albahari.com/nutshell/predicatebuilder.aspx

using System;
using System.Linq;
using System.Linq.Expressions;
using System.Collections.Generic;

namespace Linq_Question
{
    public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }
}

最後に、アイデアの動作を示す小さなコンソール アプリを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Linq_Question
{
    class Program
    {
        static void Main(string[] args)
        {
            ProductRepository repo = new ProductRepository();
            Console.WriteLine("Items over 100");
            foreach (var item in repo.Retrieve(new ProductCriteria() { WherePriceIsGreaterThan = 100 }))
            {
                Console.WriteLine(string.Format("Name {0}, Category {1}, Price {2}", item.Name, item.Category, item.Price));
            }
            Console.WriteLine("Items with a Category of Two");
            foreach (var item in repo.Retrieve(new ProductCriteria() { WhereCategoryIs = Product.Categories.CatTwo }))
            {
                Console.WriteLine(string.Format("Name {0}, Category {1}, Price {2}", item.Name, item.Category, item.Price));
            }

            Console.Read();

        }
    }
}

このアイデアを拡張して複数のフィルターを追加し、IProductFilter から返された関数を式に AND または OR する必要があるかどうかを判断することもできます。

フィルタはリポジトリに挿入できるため、実行時に簡単に変更できます。

これがあなたにいくつかのアイデアを与えることを願っています。

于 2012-02-10T15:08:53.677 に答える