从excel文件读取时CPU使用率达到100%?

问题描述:

我创建了一个VB.Net应用程序,它将从excel文件中读取并将数据放入一个表中。 我用了一个有3列和65000行的Excel表格。 在开始读取excel之前,我的机器的CPU使用率约为15%,但在读取期间CPU使用率跳至95%。 我不知道它为什么会发生?有人可以帮我解决这个问题吗? 以下是我写的代码:从excel文件读取时CPU使用率达到100%?

Private Sub readFromExcel(ByVal fileName As String, ByVal sheetName As String) 
    Dim connString As String = "data source=XE; user=test; password=test" 
    Dim con As New OracleConnection(connString) 
    Dim str1 As String 
    Dim str2 As String 
    Dim str3 As String 
    Dim xlApp As Excel.Application 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkSheet As Excel.Worksheet 
    xlApp = New Excel.ApplicationClass 
    xlWorkBook = xlApp.Workbooks.Open(fileName) 
    xlWorkSheet = xlWorkBook.Worksheets(sheetName) 
    Dim x As Integer 
    Dim y As Integer 
    Dim i As Integer 
    x = xlWorkSheet.Rows.Count() 
    y = xlWorkSheet.Columns.Count() 
    Try 
     For i = 1 To x - 1 
      'MsgBox(xlWorkSheet.Cells(i, 0).value) 
      str1 = xlWorkSheet.Cells(i, 1).value 
      str2 = xlWorkSheet.Cells(i, 2).value 
      str3 = xlWorkSheet.Cells(i, 3).value 
      insertData() 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message()) 
    Finally 
     con.Close() 
     xlWorkBook.Close() 
    End Try 
End Sub 

Private Sub insertData() 
    Dim str As String 
    str = "insert into test_import values('" + str1 + "'," + str2 + "," + str3 + ")" 
    Dim cmd As New OracleCommand() 
    cmd.CommandText = str 
    cmd.Connection = con 
    cmd.ExecuteNonQuery() 
End Sub 

thx提前。

+0

你的代码是什么样的? – APrough 2012-04-05 12:06:52

+0

从excel中读取和单独插入65k记录只需要一些CPU电源,这就是全部... – Mr47 2012-04-05 12:18:22

+0

我尝试了没有插入和jus 1000行也,那时候它也会达到最大。 – 2012-04-05 12:21:13

这是完全正常的。一个程序只有不会当I/O陷入困境时刻100%核心。从磁盘或网卡上读取,这会在操作系统提供数据时阻止程序。你的代码不会像这样陷入困境,你要求它做一堆工作。逐个获取195,000个单元值需要一段时间。 Excel是一个进程外COM服务器,因此每个单元读取需要两个CPU上下文切换。您可以通过使用Range来优化它。或者通过在带有双核CPU的机器上运行它,因此它只能拍摄高达50%。

功能,而不是一个错误。

将195000个单元一次读入Object数组,然后循环对象数组的速度要快得多。 (每个.Net调用Excel对象模型的开销非常高)

使用get_range(cell1,cell2)方法获取单元格值。

您可以使用它逐行,逐列或单次取所有单元格的值。

当您调整代码以逐行读取单元格值或一次读取所有单元格值时,请务必留意CPU使用情况。