如何向RavenDB - Embedded添加几百万个文档

时间:2012-03-22 22:39:59

标签: ravendb

我已经安装了NuGet的最新嵌入式二进制文件,并使用此代码存储“产品”poco。稍后,进程将以OutOfMemoryException终止。将这么多数据存储在Raven的范围之外吗?

谢谢。 斯蒂芬

var store = new EmbeddableDocumentStore { DataDirectory = @"C:\temp\ravendata", UseEmbeddedHttpServer = true };
store.Initialize();

using (var session = store.OpenSession())
{
    foreach (var item in Parsers.GetProducts().ToList())
    {
        session.Store(item);

    }
    session.SaveChanges();
    //var rdbList = session.Query<Product>().ToList();
}


[Serializable]
public class Product
{
    public decimal ProductId { get; set; }

    public string ItemNum { get; set; }

    public string ProductName { get; set; }

    public string BrandName { get; set; }

    public string UOM { get; set; }

    public string AveWeight { get; set; }

    public string CasePack { get; set; }

    public string PackageRemarks { get; set; }

    public decimal Price { get; set; }

    public string SupplierName { get; set; }

    public string Url { get; set; }

    public bool IsSpecialOrderItem { get; set; }

    public bool IsSpecialPriceItem { get; set; }

    public bool IsRebateItem { get; set; }

    public bool IsTieredPricingItem { get; set; }

    public bool IsOfflineSupplierItem { get; set; }

    public string Catalog { get; set; }

    public decimal CatalogId { get; set; }

    public decimal CategoryId { get; set; }

    public decimal PriceGroupId { get; set; }

    public decimal OffineSupplierId { get; set; }

    public string ManufactureName { get; set; }

    public string ManufactureNum { get; set; }

    public string Upc { get; set; }

    public string Info { get; set; }

    public string INFO2 { get; set; }
}

2 个答案:

答案 0 :(得分:2)

你做的批次有多大?看起来人们有256个批量大小的成功。似乎更多会导致超时和内存异常。

*编辑:听起来建议每批创建一个新会话,以免会话打开太长而导致超时错误。

答案 1 :(得分:2)

不,RavenDB对这么多数据来说非常好。除非您没有 RunInMemory ,否则 EmbeddedDocumentStore 与独立服务器几乎相同,只是没有http开销并且可以从客户端直接访问数据库。

鉴于您的代码,您希望确保批量存储文档,例如:每个会话1024。您要确保的另一件事是,您的GetProducts()方法返回一个IEnumerable,并以适当的ETL方式生成项目。