我正在尝试为交易系统构建一个数据库。数据是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文档可以在这里找到。