Tôi đang cố gắng ghi nhiều tệp ASPRS LAS vào Cơ sở dữ liệu địa lý tệp ESRI bằng cách biên dịch GDAL 1.9.2. Trình điều khiển FileGDB cho GDAL / OGR dường như cực kỳ chậm khi viết các tệp lớn, mất tới 45 phút để viết chỉ 8 triệu bản ghi. Tốc độ ghi của FileGDB bằng GDAL trên ổ đĩa SATA3 nằm ở mức 200 kilobyte mỗi giây, tốc độ chậm không thể chấp nhận được khi tôi đang cố gắng chuyển đổi dữ liệu terrabyte.
Tôi nhận thấy trong tài liệu FileGDB xác định macro FGDB_BULK_LOAD sẽ cải thiện hiệu suất cho các bộ dữ liệu lớn, nhưng tôi nhận thấy không có thay đổi nào về hiệu suất khi tôi viết một dòng vào tệp "nmake.opt" với văn bản "FGDB_BULK_LOAD = YES" ngay sau FGDB_LIB hàng.
Phải thừa nhận rằng, FileGDB không phải là cách lý tưởng để lưu trữ hàng tỷ bản ghi dữ liệu điểm, nhưng đó là một sự kìm kẹp trong một thời điểm khác. Tôi đã sử dụng đúng tính năng FGDB_BULK_LOAD chưa? Có phải đó là trong mã nguồn của tôi , không phải là bản dựng GDAL?
Cảm ơn.
CẬP NHẬT: Sử dụng đúng cách: (Đã trả lời trong trò chuyện)
Các FGDB_BULK_LOAD
thiết lập được lưu trữ đúng cách như là một biến môi trường cho quá trình GDAL / OGR. Điều này được đặt trên dòng lệnh trong cuộc gọi ogr exe như được hiển thị bởi Ragi. Sử dụng các hàm GDAL, nó có thể được thiết lập theo chương trình cho toàn bộ quá trình với
CPLSetConfigOption("FGDB_BULK_LOAD", "YES");
hoặc chỉ cho chủ đề hiện tại bằng cách sử dụng
CPLSetThreadLocalConfigOption("FGDB_BULK_LOAD", "YES");
FGDB_BULK_LOAD
phải được đặt trước khi gọi FGdbDataSource::CreateLayer()
. Không rõ liệu có OGRCleanupAll()
đặt biến này hay không, nhưng có thể gọi nhiều lần để đảm bảo an toàn.
Sử dụng tùy chọn đó đã tăng hiệu suất nhanh hơn khoảng 5,5 lần để viết hàng triệu đến hàng chục triệu điểm.