批量加载性能

本文通过对比单条提交、批量提交及批量插入的方式,展示了不同数据加载策略对性能的影响。实验结果显示,采用批量插入的方法能够显著提升数据加载的速度。

在大量加载数据是遇到性能问题,检查后发现客户采用的是单条插入单条提交这种最缓慢的方式,为了给客户说明优化效果,现场做了几个代码。


最简单的优化方式莫过于减少COMMIT频度,而最优化的方式是采用批量插入的方式,简单的测试代码如下:


SQL> CREATE TABLE T_INSERT (ID NUMBER, NAME VARCHAR2(30));
Table created.
SQL> SET TIMING ON
SQL> BEGIN
2 FOR I IN 1..100000 LOOP
3 INSERT INTO T_INSERT VALUES (I, 'A' || I);
4 COMMIT;
5 END LOOP;
6 END;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.22

 


SQL> BEGIN
2 FOR I IN 1..100000 LOOP
3 INSERT INTO T_INSERT VALUES (I, 'A' || I);
4 COMMIT;
5 END LOOP;
6 END;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.51

 


SQL> BEGIN
2 FOR I IN 1..100000 LOOP
3 INSERT INTO T_INSERT VALUES (I, 'A' || I);
4 IF MOD(I, 1000) = 0 THEN
5 COMMIT;
6 END IF;
7 END LOOP;
8 COMMIT;
9 END;
10 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:04.01

 


SQL> BEGIN
2 FOR I IN 1..100000 LOOP
3 INSERT INTO T_INSERT VALUES (I, 'A' || I);
4 IF MOD(I, 1000) = 0 THEN
5 COMMIT;
6 END IF;
7 END LOOP;
8 COMMIT;
9 END;
10 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:02.64

 


SQL> DECLARE
2 TYPE T_NUM IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 TYPE T_VAR IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
4 V_NUM T_NUM;
5 V_VAR T_VAR;
6 BEGIN
7 FOR I IN 1..100000 LOOP
8 V_NUM(I) := I;
9 V_VAR(I) := 'A' || I;
10 END LOOP;
11 FORALL I IN 1..100000
12 INSERT INTO T_INSERT VALUES (V_NUM(I), V_VAR(I));
13 COMMIT;
14 END;
15 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.37

 


SQL> DECLARE
2 TYPE T_NUM IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 TYPE T_VAR IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
4 V_NUM T_NUM;
5 V_VAR T_VAR;
6 BEGIN
7 FOR I IN 1..100000 LOOP
8 V_NUM(I) := I;
9 V_VAR(I) := 'A' || I;
10 END LOOP;
11 FORALL I IN 1..100000
12 INSERT INTO T_INSERT VALUES (V_NUM(I), V_VAR(I));
13 COMMIT;
14 END;
15 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.50

 


这个例子明确说明了单条提交、批量提交以及数值插入的性能差异,很多时候只是口头上的描述,客户不会有太深的印象,而如果通过这种例子来展示性能的差别,结果一目了然,比再多的描述都管用得多。

 

 

### 批量加载图片功能的实现 为了实现批量加载图片的功能并支持多种格式,可以通过 Python 的 `os` 和 `Pillow` 库完成此任务。以下是详细的解决方案: #### 1. 使用 `os` 遍历目录下的所有文件 通过 `os.walk()` 方法可以遍历指定目录及其子目录中的所有文件,并筛选出符合条件的图片文件。 ```python import os def get_image_files(directory, extensions=None): """ 获取指定目录下所有的图片文件路径列表。 参数: directory (str): 要扫描的根目录路径。 extensions (list): 支持的图片扩展名列表,默认为常见图片格式。 返回: list: 图片文件的绝对路径列表。 """ if not extensions: extensions = ['.jpg', '.jpeg', '.png', '.bmp', '.gif'] # 默认支持的图片格式 image_files = [] for root, _, files in os.walk(directory): for file in files: if any(file.lower().endswith(ext) for ext in extensions): full_path = os.path.join(root, file) image_files.append(full_path) return image_files ``` 上述代码实现了从指定目录中获取所有匹配扩展名的图片文件路径[^1]。 --- #### 2. 加载图片数据 利用 Pillow (`PIL`) 库加载图片数据。该库能够很好地兼容多种图片格式。 ```python from PIL import Image def load_images(image_paths): """ 将图片路径列表转换为图像对象列表。 参数: image_paths (list): 图片文件的绝对路径列表。 返回: list: 包含 PIL.Image 对象的列表。 """ images = [] for path in image_paths: try: img = Image.open(path) images.append(img) except Exception as e: print(f"无法打开 {path}: {e}") return images ``` 这段代码会尝试加载每张图片并将它们存储为 `Image` 对象列表[^4]。 --- #### 3. 组合函数实现完整的批量加载逻辑 将以上两个部分组合起来形成一个完整的批量加载图片的工具。 ```python def batch_load_images_from_directory(directory, extensions=None): """ 从指定目录中批量加载图片。 参数: directory (str): 要扫描的根目录路径。 extensions (list): 支持的图片扩展名列表。 返回: tuple: (图片路径列表, 图像对象列表) """ image_paths = get_image_files(directory, extensions=extensions) images = load_images(image_paths) return image_paths, images ``` 调用这个函数即可轻松实现批量加载图片的需求。 --- #### 示例运行 假设有一个名为 `images_folder` 的文件夹,其中包含若干 `.jpg`, `.png` 文件,则可按如下方式执行: ```python directory = 'images_folder' image_paths, images = batch_load_images_from_directory(directory) print("找到的图片数量:", len(images)) for i, img in enumerate(images[:5]): # 显示前五张图片的信息 print(f"第 {i+1} 张图片大小: {img.size}, 格式: {img.format}") ``` --- ### 注意事项 - **性能优化**: 如果目标目录较大或者包含大量高分辨率图片,建议分批次处理以减少内存占用。 - **错误处理**: 上述代码已加入简单的异常捕获机制,在实际应用中可根据需求增强健壮性。 - **跨平台适配**: 确保在不同操作系统间测试代码行为的一致性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值