2012-04-05 6 views
1

私はexcelファイルから読み込み、テーブルにデータを入れるVB.Netアプリケーションを作成しました。 3列と65000行の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

+0

65kレコードのExcelと個々のインサートからの読み込みには、CPUのパワーがかかっているだけです... – Mr47

+0

jus 1000行でも試してみましたが、その時も最大になりました。 –

答えて

4

これは完全に正常です。プログラムのみはI/Oでぶつかるとコアが100%焼き付きませんです。オペレーティングシステムがデータを提供している間にプログラムをブロックするディスクまたはネットワークカードからの読み取り。あなたのコードはそれほどうんざりしていません、あなたは仕事の束をするように求めています。 1つ1つずつ195,000セルの値を取得するだけで時間がかかります。 ExcelはアウトプロセスCOMサーバーなので、すべてのセルを読み取るには2つのCPUコンテキストスイッチが必要です。代わりにRangeを使用することで、それを少し最適化することができます。または、2コアCPUを搭載したマシン上で実行することで、最大50%までしか撃たれません。

機能、バグではありません。

3

195000個のセルをObject配列に読み込んでオブジェクト配列をループする方がはるかに高速です。 (Excelオブジェクトモデルへの.Net呼び出しごとに非常に高いオーバーヘッドがあります)

1

get_range(cell1,cell2)メソッドを使用してセルの値を取得します。

セルの値を行単位、列単位、またはすべてのセル値を1つの値として取ることができます。

コードを調整して行、列、またはすべてのセル値を1つのセル値で読み取るようにコードを調整するときは、CPU使用率を監視してください。

関連する問題