我想知道使用db4o的正确方法,并询问它是否适合我的情况

时间:2012-02-02 15:57:15

标签: c# performance time db4o

我正在尝试为交易系统构建数据库。数据是Forex Tick数据,结构非常简单,下面是我用来创建数据对象的类。正如您所注意到的,该类只有四个属性。真的很简单,对吧?

 using System;
 using System.Globalization;

 namespace InteractiveBrokersTradingSystem
 {
    class ForexDataObject
   {
    public ForexDataObject(string pairName, string timeString, double bid, double ask)
    {
        PairName = pairName;

        var span = DateTime.ParseExact(timeString, "yyyy.MM.dd HH:mm:ss.fff", CultureInfo.InvariantCulture) - new DateTime(1970, 1, 1, 0, 0, 0);
        TimeStamp = span.Ticks;

        Bid = bid;

        Ask = ask;
    }

    public string PairName { get; set; }

    public long TimeStamp { get; set; }

    public double Bid { get; set; }

    public double Ask { get; set; }
}

}

好了,现在我们读取CSV文件,它可以节省很多刻度数据。我在这里进行了实验:我收集了EURUSD.csv中保存的1个月(2012.01.01 --- 2012.02.02)EURUSD对​​刻度数据。 csv文件有2465671行。我在csv中读到的方法是构建ilist,如下所示,所以现在我有2465671个对象,每个都保存一个tick:

           IList<ForexDataObject> forexObjectList = new List<ForexDataObject>();
            string[] headers = csv.GetFieldHeaders();

            while (csv.ReadNextRecord())
            {
                    var forexDataObject = new ForexDataObject(pairName, csv[0],Convert.ToDouble(csv[1]),Convert.ToDouble(csv[2]));
                    forexObjectList.Add(forexDataObject);
            }

CSV文件现在是137MB我想将这些2465671对象写入名为Forex.YAP的Yap文件中,代码如下:

        using (IObjectContainer db = Db4oEmbedded.OpenFile(ForexYapFileName))
            {
                foreach(ForexDataObject forexDataObject in forexObjectList)
                {
                    db.Store(forexDataObject);
                }

            }

关于存储到db4o数据库的统计信息:时间:差不多20分钟!!!! YAP文件的大小为:248MB

我是以错误的方式做的吗?

2 个答案:

答案 0 :(得分:1)

不是说使用db4o是错误的,但为什么不将它存储在SQL(MySQL / MS SQL)数据库中呢?支持存储的所有类型,它应该比db4o提供更好的性能。

如果您只是在本地查看它,您甚至可以考虑使用MS SQL Compact Edition数据库。

至于为什么它比* .csv文件大得多,我不会假装知道很多关于它是如何存储的内部工作方式,但我想Yap文件存储了更多的信息对于每个对象而不是只是数据本身。

答案 1 :(得分:0)

我自己从未使用过db4o,但似乎对包含许多行的表的性能存在一些顾虑。请参阅stackoverflow中的示例db4o experiences?。正如@Siyfion指出的那样,存储对象而不仅仅是数据会有一些开销。

最初,我打算建议尝试使用多个线程来提高性能,但db4o community website上的这篇文章表明这​​可能不会带来任何改进;如果您致力于在论坛中使用db4o,那么可能比StackOverflow更有帮助。

@Siyfion已经建议的几个替代方案是:

的MySQL

自从我使用MySQL以来已经有一段时间了,所以我无法对其性能发表评论,但在另一个问题Isthere any class in MySql that is like BulkCopy Class in Sql Server 2005中可以找到使用LOAD DATA IN FILE的示例。

MS SQL

另一个建议的替代方法是使用MS SQL数据库。然后,您可以使用SqlBulkCopy插入数据的数据表。可以在SqlBulkCopy from a List<>处找到讨论,其中包含几个有用的链接。可以找到MSDN文档here