【问题标题】:I want to know the correct way to use db4o and ask whether it is good choice for my case我想知道使用db4o的正确方法并询问它是否适合我的情况
【发布时间】:2023-03-26 22:40:01
【问题描述】:

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

 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 文件。我在这里进行了实验:我收集了 1 个月(2012.01.01 --- 2012.02.02)EURUSD 对报价数据,保存在 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

我做错了吗?

【问题讨论】:

    标签: c# performance time db4o


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我完全同意,因为 db4o 具有将 c# 程序中的对象直接保存到 Yap 文件的理念。它必须有一些开销。同时,但我听说mysql不是很快?我从 csv 文件加载完全相同的数据,等待 30 秒。你觉得我的sql会咬吗?您如何看待二进制文件?提前致谢/。
    • 我会说,如果 mySQL 不够足够快,那么处理代码的编写方式就会出现大问题。这取决于它是纯本地解决方案还是可以托管?
    • 感谢您的帖子。我的计划是从数据库(mysql,二进制,甚至 csv 直接)加载数据并将其保存在内存中的一个数据结构中,然后进行回测。这就是我想要的:)
    • 只是另一个注释。那么直接存储对象的开销并不比在关系数据库中存储东西大。然而 db4o 并没有针对数百万个平面对象进行优化。关系数据库针对这种表格平面数据进行了优化,因此它们对于这种数据会做得更好。
    【解决方案2】:

    我自己从未使用过 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 找到。

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      相关资源
      最近更新 更多