您的位置:程序门 -> .net技术 -> c#



關於讀取大型txt文檔的效率問題!~


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


關於讀取大型txt文檔的效率問題!~
发表于:2008-02-27 15:42:13 楼主
  application.doevents();
                                streamreader   sr   =   new   streamreader(path);
                                system.collections.arraylist   list   =   new   system.collections.arraylist();
                                progress.minimum   =   0;
                                progress.maximum   =   y;//怎么獲取文檔是的行數目

                                while   (sr.peek()!=-1)
                                {
                                        progress.value++;
                                        list.add(sr.readline());
                                }
                                  sr.close();

這樣讀取好慢..因為文件很大上了600m
怎么用多線程加快點速度???
发表于:2008-02-27 15:52:331楼 得分:0
600m的txt文檔也太大了吧!
幫頂
发表于:2008-02-27 16:01:362楼 得分:0
分块读取。
每次读1m左右即可。看用户的阅读速率
发表于:2008-02-27 16:07:443楼 得分:0
怎么分快呀!~~
給個例子``
发表于:2008-02-28 08:32:254楼 得分:0
高手請回答
分不夠...跟我說
发表于:2008-02-28 08:39:345楼 得分:0
你都没说读出来干什么
发表于:2008-02-28 08:55:396楼 得分:0
分塊讀就是說每次讀一部分,比如三十行,等用戶做某個動作後再繼續讀.
具體的處理要看你讀出來做什麽用
发表于:2008-02-28 15:08:247楼 得分:0

  comm   c   =   new   comm();
                private   string   path;
                private   int   line   =   0;
                public   dataclass(string   path)
                {
                        this.path   =   path;
                }
                private   int   dowork()
                {
                        streamreader   sr   =   new   streamreader(path);
                        while   (sr.readline()!=null)
                        {
                                line++;
                        }
                        sr.close();
                        return   line;
                }

                ///   <summary>
                ///   文檔數據讀入dataset
                ///   </summary>
                ///   <param   name   =   "tablename"> 數據表名 </param>
                ///   <param   name   =   "n"> 從文檔多少行開始作為數據 </param>
                ///   <param   name   =   "col"> 列數 </param>
                ///   <param   name   =   "ch"> 文檔路徑 </param>
                  public   dataset   tablebase(string   tablename,   int   n,   int   col,char   ch,toolstripstatuslabel   rowconut,   toolstripprogressbar   progress)
                {
                        try
                        {                              
                                streamreader   sr   =   new   streamreader(path);
                                progress.minimum   =   0;
                                int   rows   =   dowork();
                                progress.maximum   =   rows;
                                dataset   ds   =   myset(tablename);
                                string   line   =   "";
                                for   (int   i   =   0;   i   <   rows;   i++)
                                {
                                        rowconut.text   =   "行數:"   +   i   +   "/"   +   rows.tostring();
                                        application.doevents();
                                        line   =   sr.readline();
                                        progress.value++;
                                        if   (i   > =   n)
                                        {
                                                string[]   srvalue   =   line.split(',');
                                                datarow   row   =   ds.tables[tablename].newrow();
                                                for   (int   j   =   0;   j   <   ds.tables[tablename].columns.count;   j++)
                                                {
                                                        row[j]   =   srvalue[j];
                                                }
                                                ds.tables[tablename].rows.add(row);
                                        }
                                }
                                sr.close();
                                //if   (list.count   ==   0)
                                //{
                                //         messagebox.show("文檔中沒有數據行!",   "提示!",   messageboxbuttons.ok,   messageboxicon.stop);
                                //         return   null;
                                //}
                                //if   (list.count   <   n   -   1)
                                //{
                                //         messagebox.show("開始數據行超過範圍!",   "提示!",   messageboxbuttons.ok,   messageboxicon.stop);
                                //         return   null;
                                //}
                             
                                return   ds;
                        }
                        catch   (exception   err)   {   throw   err;   }

讀取出來後插入數據庫!~~
想用多線程來讀!~~
那個大哥給個實例```
发表于:2008-02-28 15:16:358楼 得分:0
就知道是搞转换之类的,你需要调整缓冲区大小,例如你可以试试每读n行提交一次数据库,然后配置这个n看看为多少的时候比较合理(速度比较快、占用的内存还能承受),没必要多线程,在循环中加入application.doevents()就不会卡了。
发表于:2008-02-28 15:29:579楼 得分:0
樓上的意思也就是我上面的代碼的意思吧!~~
不過我是一行一行滴讀取的
发表于:2008-02-28 15:34:3410楼 得分:0
我現在不想一行一行的讀取.因為txt裡有時一條數據換行了(意思是本來是一條完整的數據的,但在txt裡卻用兩行來記錄的)
現在衹能每次讀取30個逗號長度的字條做為一條數據來插入數據庫(txt中數據間的分隔符是逗號)
发表于:2008-02-28 15:36:4211楼 得分:0
还有,楼主,你知道数据导入导出么?
jet   4.0的驱动支持文本文件的,其中的数据项及字段也是逗号分割的。
发表于:2008-02-28 15:40:1312楼 得分:0
我知道
发表于:2008-02-28 15:42:5913楼 得分:0
这种一般是先对文本进行预处理,让它符合格式,如果导入到微软的数据库,一个sql语句就搞定了
发表于:2008-02-28 15:50:1014楼 得分:0
怎么實現每次讀取30個逗號長度的字條


快速检索

最新资讯
热门点击