0

複数のシートを含む Excel ファイルを取得してデータベースに配置できるように、アプリケーションを作成できました。ただし、調べてみた30mb以上の大きなファイルでこれを行う方法がわかりませんbufferedReaderが、一度に一部を読み取り、Apache POIを使用して複数のExcelシートを読み取るため、これが必要かどうかわかりません。

現在、ファイルをビッグに送信すると、Java ヒープ スペース エラーが発生します。これが、ファイルが大きすぎると感じている理由です。テスト中は問題なく動作し、その後 32MB ファイルを使用しましたが、失敗しました。

以下はコードです。事前に助けていただければ幸いです。myfile も引数です

ci_model = createObject("component", "com.data_feeds.models.ci.model_item_setup");
FileIn = createObject("java","java.io.FileInputStream").init(javacast("string", myfile));
wb = createObject("java","org.apache.poi.xssf.usermodel.XSSFWorkbook").init(FileIn);
workbook = createObject("java","org.apache.poi.xssf.streaming.SXSSFWorkbook").init(wb);
sheetCount = workbook.getNumberOfSheets();

for(sheetIndex = 0; sheetIndex LT sheetCount; sheetIndex = sheetIndex + 1)
{
    recordIndex = 1;
    sheet = workbook.getSheetAt(sheetIndex);

    rowHeader = sheet.getFirstRowNum();
    rowCount = sheet.getLastRowNum();

    for (rowIndex = 1; rowIndex LTE rowCount; rowIndex = rowIndex + 1)
    {
        row = sheet.getRow(rowIndex);
        columnCount = row.getLastCellNum();

        for(columnIndex = 0; columnIndex LT columnCount; columnIndex = columnIndex +1)
        {
            record[recordIndex][columnIndex+1] = row.getCell(columnIndex);
            if((columnIndex+1)==4)
            {
                record[recordIndex][columnIndex+1] = ci_model.boolean_number(row.getCell(columnIndex).toString());
            }
        }
        recordIndex = recordIndex + 1;
        if(recordIndex == 500)
        {
            this.insert_record(record);
            arrayClear(record);
            request.help.debug.collect_garbage();
            recordIndex = 1;
        }
    }
    this.insert_record(record);
    arrayClear(record);
}
FileIn.close();

ColdFusion 8 を使用しています。

4

1 に答える 1

1

最善の策は、データを一時テーブルにインポートすることです。次に、ColdFusion を使用して一時テーブルからプライマリ テーブルにデータをインポートします。このように、ColdFusion を使用して、一度にすべてではなくチャンクでデータをインポートすることができます。SQL Server にインポートするには、インポート ツールを使用するだけでよく、mySQL にはいくつかの方法があります。個人的には、csv ファイルを使用してインポートするだけです。このプロセスが少し直接的ではないことは承知していますが、ColdFusion プロセスへの負担が少なくなり、SQL サーバーへの負担が大きくなります。

もう 1 つの提案は、クエリやページがタイムアウトしないようにすることです。URL の後に追加する?requestTimeout=1000と、プロセスがタイムアウトするのを防ぐこともできます。Java エラーであることは理解していますが、プロセスが長すぎる場合はタイムアウトになる可能性があります。

于 2013-09-18T19:26:25.783 に答える