我想知道使用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文件,它保存了很多记号数据。我在这里做了一个实验:我收集了一个月(2012.01.01---2012.02.02)的EURUSD对tick数据,这些数据保存在EURUSD.csv中。csv文件有2465671行。我在csv中读取的方式是构建如下所示的ilist,所以现在我有2465671个对象,每个对象都保存一个勾号:

           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

我做这件事的方式不对吗?

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

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

至于为什么它比*.csv文件大得多,我并不假装知道它是如何存储的,但我认为Yap文件为每个对象存储的信息比数据本身存储的信息多得多。

我自己从未使用过db4o,但对于包含多行的表,似乎有人担心它的性能。看看stackoverflow的一个例子,db4o经验?。正如@Siyfion所指出的,存储对象而不仅仅是数据会有一些开销。

起初,我打算建议尝试使用多个线程来提高性能,但db4o社区网站上的这篇帖子表明,这可能不会带来任何改进;如果您致力于使用db4o论坛,那么它可能比StackOverflow更有帮助。

正如@Siyfion已经建议的那样,有几个替代方案是:

MySQL

我已经有一段时间没有使用MySQL了,所以我不能评论它的性能,但在这个问题中可以找到一个使用LOAD DATA IN FILE的例子。MySQL中是否有类似SqlServer2005中BulkCopy类的类。

MS-SQL

另一个建议的替代方案是使用MS SQL数据库。然后可以使用SqlBulkCopy插入数据的数据表。可以在SqlBulkCopy上从列表中找到讨论<>有几个有用的链接。MSDN文档可以在这里找到。

相关内容

最新更新