二进制序列化读取海量数据

#region MessageEntity
    [Serializable]
    public partial class MessageCollection : CollectionBase {
        public void Add( MessageEntity item ) {
            base.List.Add( item );
        }

        public void Remove( MessageEntity item ) {
            base.List.Remove( item );
        }

        public MessageEntity this[ int index ] {
            get { return List[ index ] as MessageEntity; }
            set { List[ index ] = value; }
        }
    }

    [Serializable]
    public partial class MessageEntity {

        #region definition
        public static readonly MessageEntity Empty = new MessageEntity();
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region default construnction
        /// <summary>
        /// Message
        /// </summary>
        public MessageEntity() { }
        public MessageEntity( String ID, String AccountID, String To, String From, String Cc, String Bcc, String Subject, String HtmlBody, String MessageID, Int32 Size, DateTime CreateDate, Int32 Type, Int32 Priority, Int32 Extend )
            : this() {
            _ID = ID;
            _AccountID = AccountID;
            _To = To;
            _From = From;
            _Cc = Cc;
            _Bcc = Bcc;
            _Subject = Subject;
            _HtmlBody = HtmlBody;
            _MessageID = MessageID;
            _Size = Size;
            _CreateDate = CreateDate;
            _Type = Type;
            _Priority = Priority;
            _Extend = Extend;
        }
        #endregion

        #region Field
        private String _ID;
        private String _AccountID;
        private String _To;
        private String _From;
        private String _Cc;
        private String _Bcc;
        private String _Subject;
        private String _HtmlBody;
        private String _MessageID;
        private Int32 _Size;
        private DateTime _CreateDate = DateTime.MinValue;
        private Int32 _Type;
        private Int32 _Priority;
        private Int32 _Extend;
        #endregion

        #region Property
        public String ID {
            get { return _ID; }
            set {
                _ID = value;
                FirePropertyChanged( "ID" );
            }
        }

        public String AccountID {
            get { return _AccountID; }
            set {
                _AccountID = value;
                FirePropertyChanged( "AccountID" );
            }
        }

        public String To {
            get { return _To; }
            set {
                _To = value;
                FirePropertyChanged( "To" );
            }
        }

        public String From {
            get { return _From; }
            set {
                _From = value;
                FirePropertyChanged( "From" );
            }
        }

        public String Cc {
            get { return _Cc; }
            set {
                _Cc = value;
                FirePropertyChanged( "Cc" );
            }
        }

        public String Bcc {
            get { return _Bcc; }
            set {
                _Bcc = value;
                FirePropertyChanged( "Bcc" );
            }
        }

        public String Subject {
            get { return _Subject; }
            set {
                _Subject = value;
                FirePropertyChanged( "Subject" );
            }
        }

        public String HtmlBody {
            get { return _HtmlBody; }
            set {
                _HtmlBody = value;
                FirePropertyChanged( "HtmlBody" );
            }
        }

        public String MessageID {
            get { return _MessageID; }
            set {
                _MessageID = value;
                FirePropertyChanged( "MessageID" );
            }
        }

        public Int32 Size {
            get { return _Size; }
            set {
                _Size = value;
                FirePropertyChanged( "Size" );
            }
        }

        public DateTime CreateDate {
            get { return _CreateDate; }
            set {
                _CreateDate = value;
                FirePropertyChanged( "CreateDate" );
            }
        }

        public Int32 Type {
            get { return _Type; }
            set {
                _Type = value;
                FirePropertyChanged( "Type" );
            }
        }

        public Int32 Priority {
            get { return _Priority; }
            set {
                _Priority = value;
                FirePropertyChanged( "Priority" );
            }
        }

        public Int32 Extend {
            get { return _Extend; }
            set {
                _Extend = value;
                FirePropertyChanged( "Extend" );
            }
        }

        #endregion

        #region method
        public static bool IsNullOrEmpty( MessageEntity e ) {
            return e == null || e == Empty;
        }

        protected void FirePropertyChanged( string propertyName ) {
            if( this.PropertyChanged != null ) {
                this.PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
            }
        }
        #endregion
    }
    #endregion

测试代码片断,其中有一个DEV的GridControl对象,绑定上去即可
private void button5_Click( object sender, EventArgs e ) {
            if( string.IsNullOrEmpty( textBox2.Text ) ) {
                MessageBox.Show( "请输入要测试的对象数量" );
                return;
            }
            int max = int.Parse( textBox2.Text );

            StringBuilder sb = new StringBuilder();
            for( int i = 0; i < 10240; i++ ) {
                sb.Append("ab");
            }

            MessageCollection collection = new MessageCollection();
            Stopwatch s = new Stopwatch();
            MessageEntity item = new MessageEntity();
            item.AccountID = Guid.NewGuid().ToString();
            item.Bcc = "bcc";
            item.Cc = "cc";
            item.CreateDate = DateTime.Now;
            item.Extend = 0;
            item.From = "from";
            item.ID = Guid.NewGuid().ToString();

            item.HtmlBody = sb.ToString();

            item.MessageID = Guid.NewGuid().ToString();
            item.Priority = 0;
            item.Size = 100;
            item.Subject = "subject";
            item.To = "to";
            item.Type = 0;

            s.Start();
            for( int i = 0; i < max; i++ ) {
                item.ID = Guid.NewGuid().ToString();
                collection.Add( item );
            }
            s.Stop();
            this.textBox1.Text = string.Format( "构造{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
            s.Reset();


            s.Start();
            {
                IFormatter formatter = new BinaryFormatter();
                using( Stream stream = new FileStream( "MyFile.bin", FileMode.Create,
                FileAccess.Write, FileShare.None ) ) {
                    formatter.Serialize( stream, collection );
                    stream.Close();
                }
            }
            s.Stop();
            this.textBox1.Text += string.Format( "序列化{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
            s.Reset();


            MessageCollection myObj = null;
            s.Start();
            {
                IFormatter formatter = new BinaryFormatter();
                using( Stream stream = new FileStream( "MyFile.bin", FileMode.Open,
                FileAccess.Read, FileShare.Read ) ) {
                    MessageCollection obj = myObj = (MessageCollection)formatter.Deserialize( stream );
                    stream.Close();
                    //gridControl1.DataSource = obj;
                    //gridControl1.DataMember = "MessageEntity";
                }
            }
            s.Stop();
            this.textBox1.Text += string.Format( "反序列化{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
            s.Reset();


            s.Start();
            {
                gridControl1.DataSource = myObj;
            }
            s.Stop();
            this.textBox1.Text += string.Format( "绑定{2}条数据总用时{0}毫秒{1}", s.Elapsed.TotalMilliseconds.ToString( "0.00" ), Environment.NewLine, max );
            //Process.Start( "explorer.exe", Application.StartupPath );
        }

1千条数据测试结果
构造1000条数据总用时0.76毫秒
序列化1000条数据总用时4.86毫秒
反序列化1000条数据总用时1.84毫秒
绑定1000条数据总用时108.89毫秒

1万条数据测试结果
构造10000条数据总用时7.75毫秒
序列化10000条数据总用时6.38毫秒
反序列化10000条数据总用时5.31毫秒
绑定10000条数据总用时6.41毫秒

10万条测试结果
构造100000条数据总用时105.99毫秒
序列化100000条数据总用时26.38毫秒
反序列化100000条数据总用时63.78毫秒
绑定100000条数据总用时4.51毫秒

100万条测试结果
构造1000000条数据总用时655.25毫秒
序列化1000000条数据总用时216.65毫秒
反序列化1000000条数据总用时710.97毫秒
绑定1000000条数据总用时6.99毫秒

500万条测试结果
构造5000000条数据总用时3505.64毫秒
序列化5000000条数据总用时1114.01毫秒
反序列化5000000条数据总用时5070.87毫秒
绑定5000000条数据总用时2.74毫秒

1000万条测试结果
内存溢出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值