0

以下のプログラムは、かなり速いペースでデータを受信するソケット プログラムです。CodeFirst セクションを無効にしても問題なく動作します。有効にすると、プログラムは正常に開始されますが、ゆっくりと低下し、SQL EXPRESS 2012 db に何も書き込まれていないように見えます。これを確認するには、SQL Management Studio 2012 で最後の 5 行を選択する以下の SQL ステートメントを実行します。

私が間違っていることはありますか?

select * from [MarketDataEntities]
where MarketDataEntities.MarketDataEntityID not in (
    select top (
        (select count(*) from [MarketDataEntities]) - 5
    ) MarketDataEntities.MarketDataEntityID
    from  [MarketDataEntities]
)



               using (var dbTDC = new TickDataTestContext())
                {
                    var tde = new SymbolTickDataEntity { Symbol = symbol };
                    if (!dbTDC.SymbolTickDataDbSet.Any(a => a.Symbol.Equals(symbol)))
                    {
                        dbTDC.SymbolTickDataDbSet.Add(tde);
                        dbTDC.SaveChanges();
                    }

                    var mdde = new MarketDataDepthEntity();
                    dbTDC.MarketDataDepthDbSet.Add(mdde);

                    dbTDC.SaveChanges();

                    while (true)
                    {
                        //  Wait for next request from client 
                        int len = socket.Receive(zmq_buffer);
                        if (len < 1)
                        {
                            Console.WriteLine("Len < 1");

                            continue;
                        }

                        //Console.WriteLine("Got quote");

                        count++;

                        // Copy the bytes
                        byte[] bytes = new byte[len];
                        Buffer.BlockCopy(zmq_buffer, 0, bytes, 0, len);

                        MarketDataDepth mdd = MarketDataDepth.CreateBuilder().MergeFrom(bytes).Build();

                        PrintMarketDataDepth(mdd);
#if false
                        for (int i = 0; i < mdd.MdCount; i++)
                        {
                            MarketData md = mdd.MdList[i];

                            string timestamp = md.Time;
                            int index = timestamp.IndexOf(",");
                            if(-1 != index)
                                timestamp = timestamp.Remove(index);

                            DateTime parseResult;
                            if (false == System.DateTime.TryParseExact(timestamp, format, provider, DateTimeStyles.None, out parseResult))
                                continue;

                            var mde = new MarketDataEntity
                            {
                                NMDDTag = (long)mdd.NMDDTag,
                                QType = (0 == md.QuoteType ? QuoteType.Bid : QuoteType.Ask),
                                QPrice = md.Price,
                                QSize = md.Size,
                                QSource = md.Source,
                                QLiquidityTag = md.ID,
                                QSilo = md.Silo,
                                QTimeStamp = parseResult
                            };

                            dbTDC.MarketDataDbSet.Add(mde);

                            mdde.Depth.Add(mde);
                        }

                        if (0 == count % 500)
                            dbTDC.SaveChanges();
#endif
                    }
                }
            }
            catch (DbEntityValidationException e)
            {
                foreach (var eve in e.EntityValidationErrors)
                {
                    Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                        eve.Entry.Entity.GetType().Name, eve.Entry.State);
                    foreach (var ve in eve.ValidationErrors)
                    {
                        Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                        ve.PropertyName, ve.ErrorMessage);
                    }
                }

                throw;
            }
        }
    }

    public enum QuoteType { Bid = 0, Ask }

    public class MarketDataEntity
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int MarketDataEntityID { get; set; }

        public long NMDDTag { get; set; }
        public QuoteType QType { get; set; }
        public double QPrice { get; set; }
        public double QSize { get; set; }
        public string QSource { get; set; }
        public string QLiquidityTag { get; set; }
        public string QSilo { get; set;}
        [Column("timestamp", TypeName = "datetime2")]
        public DateTime QTimeStamp { get; set; }
    }

    public class MarketDataDepthEntity
    {
        public int MarketDataDepthEntityID { get; set; }
        public virtual IList<MarketDataEntity> Depth { get; set; }

        [Column("timestamp", TypeName = "datetime2")]
        public DateTime TimeStamp { get; set; }
        public MarketDataDepthEntity() { Depth = new List<MarketDataEntity>(); }
    }

    public class SymbolTickDataEntity
    {
        public int SymbolTickDataEntityID { get; set; }

        [Key]
        [Required]
        public string Symbol { get; set; }

        public virtual IList<MarketDataDepthEntity> Mdds { get; set; }
        public SymbolTickDataEntity() { Mdds = new List<MarketDataDepthEntity>(); }
    }

    public class TickDataTestContext : DbContext
    {
        public DbSet<MarketDataEntity> MarketDataDbSet { get; set; }
        public DbSet<MarketDataDepthEntity> MarketDataDepthDbSet { get; set; }
        public DbSet<SymbolTickDataEntity> SymbolTickDataDbSet { get; set; }
    }
4

1 に答える 1

2

あなたのコードから、アプリケーションの存続期間中 TickDataTestContext を維持しているように見えます。そのため、データを追加し続けると、ローカル キャッシュのメモリ使用量が増え続け、パフォーマンスが低下します。

コードを書き直して、保存する必要があるリクエストごとに TickDataTestContext の新しいインスタンスを作成してから作業を行い、変更を保存してコンテキストを破棄する必要があります。

于 2013-07-03T16:18:37.547 に答える