我正在尝试为交易系统构建数据库。数据是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
我是以错误的方式做的吗?
答案 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以来已经有一段时间了,所以我无法对其性能发表评论,但在另一个问题Isthere any class in MySql that is like BulkCopy Class in Sql Server 2005中可以找到使用LOAD DATA IN FILE
的示例。
另一个建议的替代方法是使用MS SQL数据库。然后,您可以使用SqlBulkCopy插入数据的数据表。可以在SqlBulkCopy from a List<>处找到讨论,其中包含几个有用的链接。可以找到MSDN文档here。