1

見出しが正しいかどうかはわかりません。そのため、編集して適切な見出しにすることができます。

問題-Vb.netコードを使用して、接続文字列とSQLクエリを使用して100,000レコードのExcelファイルを読み取ると、完了するまでに3分かかります(私には長すぎます-解決策が必要です)。

しかし、300,000レコードの別のExcelファイルを送信すると(私の要件は5,000万レコードを読み取ることです)、所要時間は30分以上でした(プログラムを容認できず、強制終了しました)

この格差と、なぜ読むのに時間がかかるのかを理解するのを手伝ってください。

(Excelファイル(Office 2010)への接続を確立する方法、およびレコードを読み取るためのクエリを実行する方法について、このようなサンプルコードがネット上で入手できるため、コードサンプルは提供しませんでした)

よろしくお願いします。解決策として、300,000レコードのファイルをそれぞれ10,000レコードのファイルに切り刻むことを考えましたが、開く時間と読み取り時間を無駄にせずにそれを行うにはどうすればよいですか?

サビヤ

PS-WindowsServer2008およびWindows7で8GBRAMを備えたコア2デュオを使用

4

4 に答える 4

0

ここに画像の説明を入力してください


したがって、私はvb.netを使用していませんが、Javaに精通している場合は、ApachePOIライブラリについてアドバイスできます。POIはすべてのデータをメモリにロードします。私の場合は完璧に機能します。その後、それをmysqlまたはpoiで数百のファイルを読み取る他の何かに保存できます。 ここで私はあなたの質問に似ている質問を見つけます。
そして、ここでPOIパフォーマンスの議論を見つけることができます。

また、別の解決策として、Excelファイルをcsvにエクスポートし、後で読み取ることもできます。これも高速だと思います。

于 2012-08-14T13:53:37.313 に答える
0
  • Excelが読み込まれるとすぐに、マクロの実行を一時的に無効にすることができます。
  • Excelは非常に大量のメモリを使用する可能性があるため、メモリの制限も別の理由です。この大きなスプレッドシート(​​100K)セルを実行している場合、メモリバンクを16GBまで使い果たします。
  • Excelファイルとハードドライブが最適化されていることを確認してください(実際の影響を確認できます)。
  • PCをシャットダウンしない場合は、シャットダウンして再起動してみてください。これにより、プロセスを解放して未使用のdllをアンロードできます。
  • データトランザクションがスムーズに行われるように、pagefile.sysのサイズをRAMの少なくとも2.5倍に増やします。
于 2012-08-14T14:28:55.903 に答える
0

大きなExcelファイルを更新する際にも同様の問題がありました。私の解決策 - その一部を更新し、閉じて、Excel プロセスを強制終了し、再度開いて、再度更新します

        oexcel.DisplayAlerts = False
        obook.SaveAs(fnExcNew, 1)
        obook.Close()
        obook = Nothing
        KillExcel()
        oexcel = CreateObject("Excel.Application")
        oexcel.Workbooks.Open(fnExcNew)
        obook = oexcel.ActiveWorkbook
        osheet = oexcel.Worksheets(1)

Private Sub KillExcel()
    ' Kill all excel processes 
    Dim pList() As Process
    Dim pExcelProcess As System.Diagnostics.Process
    pList = pExcelProcess.GetProcesses
    For Each pExcelProcess In pList
        If pExcelProcess.ProcessName.ToUpper = "EXCEL" Then
            pExcelProcess.Kill()
        End If
    Next
End Sub
于 2012-08-31T16:52:19.330 に答える
0
  1. vb.net が必須かどうか石川氏は尋ねました。VB.Net Framework 4.0 で記述されたアプリケーションの一部であるため、私の答えは「はい」です。彼はまた、Excel を csv にエクスポートして試してみることについても話しました。ユーザーはプロセスを強制終了します-私は確信しています。

  2. Soandos はクエリを要求しました - それは - 「Excel ファイルから上位 1* を選択してください」 - 私は 1 つずつ読んでいます。この同じクエリは 100,000 レコードを非常によく読み取るため、問題はこのクエリではないと思います。

  3. KronoS は Soandos をサポートしており、上記で回答しました。彼/彼女の 2 番目のポイントへの答えは - 私は優れている必要があります - これはユーザーが提供するものです。変更できません。

  4. 誰がこれに答えたかわかりませんが、マクロを無効にするというアイデアは非常に良い点です。簡単な方法ですべてのデータを読み取るために、すべてのマクロ、すべてのフィルター、およびすべての非表示を無効にする必要はありませんか? 私はそれを試してみます。

300,000 レコードの Excel ファイルの合計サイズは 61 MB です。それほど大きくありません!! メモリの問題を作成するには?

Excel でレコードを単純に読み取る速度は直線的ではないことがわかりました。4 秒で 10,000 件のレコードを読み取りますが、27 秒で 50,000 件、60 秒で 100,000 件などを読み取ります。大きなファイルを読み取るために Excel ファイルにインデックスを付ける方法を教えていただければ幸いです。5000 万行の Excel ファイルを取得すると、問題のサイズがどのくらいになるかわかりません。

于 2012-08-16T06:33:06.350 に答える