Я хочу знать, как правильно использовать db4o и спрашиваю, является ли это хорошим выбором для моего случая - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь создать базу данных для торговой системы. Данные представляют собой данные 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-файл, который сохраняет много тиковых данных. Я провел здесь эксперимент: я собираю данные за 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 занимают 137 МБ, теперь я хочу записать эти 2465671 объект в файл Yap с именем Forex.YAP и код, как показано ниже:

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

            }

Статистика хранения в базе данных db4o: Время: почти 20 минут !!!! Размер файла YAP: 248 МБ

Я делаю это неправильно?

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Не сказать, что вы неправильно используете db4o, но почему бы не сохранить его в базе данных SQL (MySQL / MS SQL)?Все хранимые типы поддерживаются, и это должно дать гораздо лучшую производительность, чем db4o.

Если вы смотрите только локально, вы можете даже рассмотреть базу данных MS SQL Compact Edition.

Что касается того, почему он намного больше, чем файл * .csv, ну, я не претендую на то, что много знаю о том, как все это хранится, но я представляю, что файл Yap хранит гораздо больше информации для каждогообъект просто сами данные.

0 голосов
/ 02 февраля 2012

Я никогда не использовал db4o самостоятельно, но, похоже, есть некоторые сомнения по поводу его производительности с таблицами, содержащими много строк. Смотрите пример из stackoverflow, db4o опыты? . И, как указывает @Siyfion, для хранения объекта потребуются некоторые издержки, а не только данные.

Изначально я собирался предложить использовать несколько потоков для повышения производительности, но этот пост на веб-сайте сообщества сообщества db4o предполагает, что это не принесет никаких улучшений; если вы решили использовать db4o на форумах, это может быть более полезным, чем StackOverflow.

Пара альтернатив, как уже было предложено @Siyfion, будет:

MySQL

Прошло много времени с тех пор, как я использовал MySQL, поэтому я не могу комментировать его производительность, но пример использования LOAD DATA IN FILE можно найти по этому другому вопросу Там есть любой класс в MySql, который похож на класс BulkCopy в SQL Server 2005 .

MS SQL

Другая предложенная альтернатива - использовать базу данных MS SQL. Затем вы можете использовать SqlBulkCopy для вставки таблицы данных. Обсуждение можно найти по адресу SqlBulkCopy из списка <> с несколькими полезными ссылками. Документацию MSDN можно найти здесь .

...