首頁 / 浏覽問題 / 組件GIS / 問題詳情
數據集批量更新效率慢
61EXP 2023年02月27日
    Recordset recordset_dlg =datasetVector.getRecordset(false,CursorType.DYNAMIC);
            Recordset.BatchEditor batchEditor = recordset_dlg.getBatch();
            //設置批量更新每次提交最大(dà)數
            batchEditor.setMaxRecordCount(10240);
            batchEditor.begin();
            int count =recordset_dlg.getRecordCount();
            StopWatch stopWatch=new StopWatch();
            stopWatch.start();
            for (int j = 0; j < count; j++) {
                recordset_dlg.setFieldValue("dlgid", 666);
                recordset_dlg.setFieldValue("vers", 777);
                recordset_dlg.moveNext();
            }
            batchEditor.update();
            stopWatch.stop();
            System.out.println(stopWatch.getNanoTime());
            recordset_dlg.dispose();
            workspace.dispose();

數據庫引擎:postgis

問題:for循環給每個(gè)記錄設置值效率慢,平均1000條耗時(shí)30S這(zhè)樣,總記錄在(zài)5W甚至十幾W這(zhè)樣這(zhè)樣,有沒有更效率的(de)方式批量更新

1個(gè)回答

您好,優化的(de)話建議您首先使用性能檢測确認下您這(zhè)部分代碼運行,時(shí)間耗費主要(yào / yāo)在(zài)哪行或者哪幾行代碼上(shàng)來(lái)做優化。

同時(shí)也(yě)可以(yǐ)在(zài)您同等代碼、設備的(de)情況下和(hé / huò)UDBX型數據對比一(yī / yì /yí)下,看下時(shí)間會不(bù)會是(shì)在(zài)數據庫通信層較大(dà)。

setMaxRecordCount的(de)設置也(yě)不(bù)是(shì)一(yī / yì /yí)味的(de)很大(dà)或者很小就(jiù)好,很小多次提交更新會影響速度,很大(dà)單次提交内存負擔較大(dà)會影響速度,

這(zhè)個(gè)值建議您根據您的(de)項目代碼内存情況和(hé / huò)設備情況來(lái)确定。

速度的(de)話,如果您的(de)業務知識等同于(yú)桌面端的(de)更新列,沒有逐條記錄操作的(de)必要(yào / yāo),建議使用updateField來(lái)實現。

速度可以(yǐ)和(hé / huò)iDesktopX桌面端屬性表裏的(de)“更新列”,來(lái)對比一(yī / yì /yí)下。

希望可以(yǐ)幫到(dào)您。
10,903EXP 2023年02月27日
問題已經描述很清楚了(le/liǎo),for循環給每個(gè)記錄setFieldValue更新慢,沒有執行到(dào)update

您好,我這(zhè)邊使用遠程(非本地(dì / de))PostGis數據源,DataSetVector. updateField和(hé / huò)Recordset.setFieldValue進行了(le/liǎo)測試,速度比您這(zhè)邊要(yào / yāo)快得多性能也(yě)很穩定。

5W數據:

整列更新1秒,批量寫入77秒(每1000條1.54秒)

101W數據:

整列更新15秒(每秒6.8w條),批量寫入1721秒(每1000條1.70秒)

因此您問題中所說(shuō)的(de)性能瓶頸,主要(yào / yāo)可能還是(shì)在(zài)您數據庫通信這(zhè)塊以(yǐ)及最大(dà)提交數的(de)調整,組件本身的(de)更新數據的(de)能力應該是(shì)可以(yǐ)滿足使用的(de),

具體代碼的(de)話截圖中也(yě)有您也(yě)可以(yǐ)參考一(yī / yì /yí)下。

...