首页 / 浏览问题 / 组件GIS / 问题详情
数据集批量更新效率慢
61EXP 2023年02月27日
    Recordset recordset_dlg =datasetVector.getRecordset(false,CursorType.DYNAMIC);
            Recordset.BatchEditor batchEditor = recordset_dlg.getBatch();
            //设置批量更新每次提交最大数
            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循环给每个记录设置值效率慢,平均1000条耗时30S这样,总记录在5W甚至十几W这样这样,有没有更效率的方式批量更新

1个回答

您好,优化的话建议您首先使用性能检测确认下您这部分代码运行,时间耗费主要在哪行或者哪几行代码上来做优化。

同时也可以在您同等代码、设备的情况下和UDBX型数据对比一下,看下时间会不会是在数据库通信层较大。

setMaxRecordCount的设置也不是一味的很大或者很小就好,很小多次提交更新会影响速度,很大单次提交内存负担较大会影响速度,

这个值建议您根据您的项目代码内存情况和设备情况来确定。

速度的话,如果您的业务知识等同于桌面端的更新列,没有逐条记录操作的必要,建议使用updateField来实现。

速度可以和iDesktopX桌面端属性表里的“更新列”,来对比一下。

希望可以帮到您。
于丁
1
10,403EXP 2023年02月27日
问题已经描述很清楚了,for循环给每个记录setFieldValue更新慢,没有执行到update

您好,我这边使用远程(非本地)PostGis数据源,DataSetVector. updateField和Recordset.setFieldValue进行了测试,速度比您这边要快得多性能也很稳定。

5W数据:

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

101W数据:

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

因此您问题中所说的性能瓶颈,主要可能还是在您数据库通信这块以及最大提交数的调整,组件本身的更新数据的能力应该是可以满足使用的,

具体代码的话截图中也有您也可以参考一下。

...