none
資料讀取寫入的 速度問題 RRS feed

  • 問題

  • 我之前都一直用excel 把讀到的資料寫入  因為數量不是很多  所以最後做寫入時 沒感覺很久
    一次我主管要我做連續三天的熱機 結果星期一我去轉到excel裡  1萬多*30的數量 整整跑三個多小時  
    我這星期自己在弄股票的程式 第一天寫好 開始從網路抓  光一個電子股 從2005抓到2009 花了十個小時
    但我自己一開始測試  把資料寫在.txt 一個月的量沒兩三分就寫完了
    所以我當時還以為電腦太久沒動 跑到休眠狀態
    開啟k線圖程式 抓資料到畫圖完也要十幾秒以上
    我最主要還是要去搜索所有的股票資料  把我要的列出來 我昨天試一遍 把乖離率過大的抓出來也花了快20分

    是excel速度本來就很慢   還是我使用方法有錯誤
    所以想請問大家一下除了.txt讀取寫入速度比較快外   還有別的嗎
    2010年1月15日 上午 06:14

解答

  • 文字檔是單純的文字結構,但 Excel 是 OLE Compound Document... 怎麼可以相提並論哩?
    不然就是用 OLE DB 的方法產生 Excel 表格,或是試試 NPOI Library。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 x32 2010年1月21日 上午 08:28
    2010年1月15日 上午 08:55
    版主
  • 使用 VBNET 存 Excel 要一直做 COM 的封裝遞送,效能有限。

    下面這段測試程式碼在同樣配備程式碼跑 00:01:33.6560000,也就是 1 分 34 秒:
    		Dim iRow, iCol, i As Integer
    		Dim rndDouble As New Random
    		Dim RndArray(2000, 30) As Double
    		Dim xlApp As Object = CreateObject("Excel.Application")
    		Dim xlBook As Object = xlApp.WorkBooks.Add
    		Dim xlSheet As Object
    
    
    		For iRow = 1 To 2000
    			For iCol = 1 To 30
    				RndArray(iRow, iCol) = rndDouble.NextDouble
    			Next
    		Next
    
    		Dim sTime As Date = DateTime.Now
    
    		For i = 1 To 5
    			xlSheet = xlBook.Sheets.Add
    			With xlSheet
    				.Name = "Add" & i
    
    				For iRow = 1 To 2000
    					For iCol = 1 To 30
    						.Cells(iRow, iCol) = RndArray(iRow, iCol)
    					Next
    				Next
    			End With
    		Next
    
    		Debug.Print((DateTime.Now - sTime).ToString())
    
    		xlBook.SaveAs("D:\Temp\Test.xls")
    		xlSheet = Nothing
    		xlBook.Close()
    		xlBook = Nothing
    		xlApp.Quit()
    		xlApp = Nothing
    		GC.Collect()

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 x32 2010年1月21日 上午 08:28
    2010年1月16日 下午 04:05

所有回覆

  • 文字檔是單純的文字結構,但 Excel 是 OLE Compound Document... 怎麼可以相提並論哩?
    不然就是用 OLE DB 的方法產生 Excel 表格,或是試試 NPOI Library。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 x32 2010年1月21日 上午 08:28
    2010年1月15日 上午 08:55
    版主
  • 你程式寫太爛了。

    存取 Automation 要避免 Active????? / Select / Selection 這類視焦會轉移的功能。

    電腦最慢的是慢在顯示而非執行。

    這段測試的 VBA 也僅 11.9999996619299 秒 (CPU C2Q6600) ,還要更快的話就是用程式碼先暫時不顯示、自動計算關閉 (僅關閉自動計算再重新啟用自動重算為 7.99999998416752 秒) ,而 VBA 是直譯,VB6/VBNET 是編譯,效能都會比 VBA 高。

    Sub Test()
       sTime = Now
       For iCol = 1 To 30
          For iRow = 1 To 10000
             Cells(iRow, iCol) = Rnd
          Next
       Next
       Debug.Print (Now - sTime) * 86400
    End Sub

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月16日 上午 01:33
  • 我沒有把它顯視出來
    只是單純存入
    下面是寫到excel的動作 
    我是在外部宣告dim ExcelArray as arraylist     把儀器上讀到的資料先丟在這 

    Dim Path, Path2 As String
            '  Dim null As Nullable(Of Double)
            Path = "C:\HP.xls"


                    '----------------------excel
                    ' Dim xlsapp2 As New Excel.Application
                    Dim xlsapp2 As Object = CreateObject("Excel.Application")
                    xlsapp2.Workbooks.Open(Path)        
                    Sheets = 1
                    Row = 1
                    Dim i As Integer
                    For i = 0 To ExcelArray.Count - 1 Step 4
                        xlsapp2.Sheets(ExcelArray.Item(i)).Cells(ExcelArray.Item(i + 1), ExcelArray.Item(i + 2)).Value() = ExcelArray.Item(i + 3)
                    Next
                    
                    xlsapp2.ActiveWorkbook.SaveAs(Trim(Path2))
                    RichTextBox1.Text += Path2 & vbCrLf
                    xlsapp2.Workbooks.Close()
                    xlsapp2 = Nothing
                    GC.Collect()
                    LoadToolStripMenuItem.Enabled = True
                End If
            Else
                MsgBox("File is not exist")
            End If



    我用讀股票資訊
    是先把網頁讀到的原始碼把我要的先丟到excel的格式內  我是分一個月一個月分開存放  每一個excel檔有355多家的資料
    如果說我讀網頁 在把資料抓出來分開丟 速度慢這還說的過去
    我現在只是把全部的excel全部放在一起  還是一樣很慢 每一年資料大概也要兩小時
    每年的資料量是250*15*355





     

    2010年1月16日 上午 02:17
  • 使用 Excel 來存大量資料並不是好主意... 使用 Text 檔也好不到哪裡去。

    Excel 是試算表, 它的主要目的在於動態而即時的運算, 不要因為它的表很大就把什麼都丟進去。我覺得在如你描述的情況中, 最好能使用資料庫來存資料 (SQL, SQL Express 等等)。
    ASP.NET 2Share - http://phone.idv.tw/cs2/
    2010年1月16日 下午 03:52
  • 使用 VBNET 存 Excel 要一直做 COM 的封裝遞送,效能有限。

    下面這段測試程式碼在同樣配備程式碼跑 00:01:33.6560000,也就是 1 分 34 秒:
    		Dim iRow, iCol, i As Integer
    		Dim rndDouble As New Random
    		Dim RndArray(2000, 30) As Double
    		Dim xlApp As Object = CreateObject("Excel.Application")
    		Dim xlBook As Object = xlApp.WorkBooks.Add
    		Dim xlSheet As Object
    
    
    		For iRow = 1 To 2000
    			For iCol = 1 To 30
    				RndArray(iRow, iCol) = rndDouble.NextDouble
    			Next
    		Next
    
    		Dim sTime As Date = DateTime.Now
    
    		For i = 1 To 5
    			xlSheet = xlBook.Sheets.Add
    			With xlSheet
    				.Name = "Add" & i
    
    				For iRow = 1 To 2000
    					For iCol = 1 To 30
    						.Cells(iRow, iCol) = RndArray(iRow, iCol)
    					Next
    				Next
    			End With
    		Next
    
    		Debug.Print((DateTime.Now - sTime).ToString())
    
    		xlBook.SaveAs("D:\Temp\Test.xls")
    		xlSheet = Nothing
    		xlBook.Close()
    		xlBook = Nothing
    		xlApp.Quit()
    		xlApp = Nothing
    		GC.Collect()

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 x32 2010年1月21日 上午 08:28
    2010年1月16日 下午 04:05