首页 > 其他分享 >优化批处理流程:自定义BatchProcessorUtils的设计与应用

优化批处理流程:自定义BatchProcessorUtils的设计与应用

时间:2024-09-15 10:23:55浏览次数:13  
标签:自定义 BatchProcessorUtils list 批次 批处理 iteratorUtil 数据 public

优化批处理流程:自定义BatchProcessorUtils的设计与应用

|  原创作者/编辑:凯哥Java                            

         |  分类:个人小工具类


优化批处理流程:自定义BatchProcessorUtils的设计与应用_List

在我们开发过程中,处理大量的数据集是一项常见的任务。特别是在数据库操作、文件处理或者任何需要对大量数据进行分批处理的应用场景中,如何有效地管理数据流成为了优化性能的关键。本文将介绍一种自定义的批量数据处理工具类——BatchProcessorUtils类,它能够帮助开发者更方便地将一个大的数据集拆分成若干个小批次,并提供便捷的遍历接口。

完整代码在文章末尾已经贴出。优化后的版本也已准备好。如果需要,lian系凯哥哦~



类的设计理念



BatchProcessorUtils类的设计目的是为了简化批量数据处理的过程。在实际应用中,比如执行数据库批量插入操作时,如果一次性插入的数据量过大,可能会导致内存溢出或者数据库锁等待时间过长等问题。而通过将数据分批处理,可以显著提高系统的响应速度和稳定性。因此,本类提供了一个简单而有效的解决方案来解决这一问题。


类的基本结构


BatchProcessorUtils类主要包括以下几个部分:

①:数据存储:使用一个List来存储所有的数据项。

②:批次大小定义:通过构造函数传入参数来设定每次处理的数据量。

 ③:遍历控制:内部维护一个指针cursor来跟踪当前的处理进度。

④:方法实现:包括了hasNext()方法判断是否还有未处理的数据,next()方法获取下一个批次的数据,以及add()和addAll()方法允许动态地向数据集中添加新的元素或集合。



使用示例



创建一个BatchProcessorUtils实例非常简单,可以通过两种方式初始化:


// 使用Collection初始化

Collection<String> collection = Arrays.asList("A", "B", "C", "D", "E");

BatchProcessorUtils<String> iteratorUtil = new BatchProcessorUtils<>(collection, 2);



// 或者使用数组初始化

String[] array = {"A", "B", "C", "D", "E"};

iteratorUtil = new GroupIteratorUtils<>(array, 2);



接下来就可以使用`iteratorUtil.hasNext()`检查是否有更多的批次可以处理,并且使用`iteratorUtil.next()`来获取下一个批次的数据:


while (iteratorUtil.hasNext()) {

    List<String> batch = iteratorUtil.next();

    System.out.println(batch); // 输出每个批次的数据

}



此外,还可以随时向BatchProcessorUtils对象中添加新的数据:


iteratorUtil.add("F");

iteratorUtil.addAll(Arrays.asList("G", "H"));




结论



BatchProcessorUtils类为开发者提供了一个灵活的工具来处理大数据集。通过合理的批次划分,不仅可以提升程序的执行效率,还能有效地避免内存溢出等潜在的风险。对于那些需要频繁处理大批量数据的应用来说,这个工具无疑是一个值得考虑的选择。


完整代码


package com.kaigejava.common.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * 批量插入数据组迭代器
 * 将一个数据组拆分成多个小的批次,并进行遍历这些批次的功能
 */
public class BatchProcessorUtils<E> {
    // 数据列表
    private List<E> list;
    // 每个批次中的数据数量
    private int numInGroup;
    // 当前遍历的位置指针
    private int cursor = 0;

    /**
     * 构造函数,用于构造一个批量插入数据组迭代器实例
     *
     * @param list 数据集合
     * @param num  每个批次中的数据数量
     */
    public BatchProcessorUtils(Collection<E> list, int num) {
        this.list = new ArrayList(list);
        this.numInGroup = num;
    }

    /**
     * 构造函数,用于构造一个批量插入数据组迭代器实例
     *
     * @param elements 数据数组
     * @param num      每个批次中的数据数量
     */
    public BatchProcessorUtils(E[] elements, int num) {
        this.list = new ArrayList();
        this.list.addAll(Arrays.asList(elements));
        this.numInGroup = num;
    }

    /**
     * 判断是否还有下一个批次
     *
     * @return 如果还有下一个批次,则返回true;否则返回false
     */
    public boolean hasNext() {
        return this.cursor != this.list.size();
    }

    /**
     * 获取下一个批次的数据,并将遍历指针移动到下一批次的起始位置
     *
     * @return 下一个批次的数据列表
     */
    public List<E> next() {
        List<E> subElements = new ArrayList(this.list.subList(this.cursor, Math.min(this.cursor + this.numInGroup, this.list.size())));
        this.cursor = Math.min(this.cursor + this.numInGroup, this.list.size());
        return subElements;
    }

    /**
     * 向数据列表中添加一个元素
     *
     * @param element 要添加的元素
     */
    public void add(E element) {
        this.list.add(element);
    }

    /**
     * 向数据列表中添加一个元素集合
     *
     * @param elements 要添加的元素集合
     */
    public void addAll(Collection<? extends E> elements) {
        this.list.addAll(elements);
    }
}


标签:自定义,BatchProcessorUtils,list,批次,批处理,iteratorUtil,数据,public
From: https://blog.51cto.com/kaigejava/12023527

相关文章

  • C# 使用NPOI 导出文件到Excel.支持分页及自定义排序
    导出帮助类usingNPOI.HSSF.UserModel;usingNPOI.OpenXmlFormats.Spreadsheet;usingNPOI.OpenXmlFormats.Vml;usingNPOI.SS.UserModel;usingNPOI.SS.Util;usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.IO;usingSystem.Text;......
  • jvm 自定义dns
    对于jvm进行自定义dns可以解决不少问题(比如特定系统需要一个额外的域名改写,但是并不希望进行全局修改)对于java1.4-8我们是可以直接进行dns配置的(系统属性就可以了),之后的版本就不行了,具体参考dnsjava的说明实际配置参考配置-Dsun.net.spi.nameservice.provider.1=dns,sun-D......
  • QtDesigner控件提升为自定义控件
    创建自定义控件classMyTextEdit(QTextEdit):fanYi=Signal(str,QPoint)def__init__(self,parent=None):super(MyTextEdit,self).__init__(parent)#指定菜单self.setContextMenuPolicy(Qt.CustomContextMenu)#连接菜单函......
  • IP核学习之自定义ram:参照IP核xilinx_dist_sdpram_0oregs_32x12
    一、DistributedMemoryGenerator有什么用?DistributedMemoryGenerator是Vivado中的IP核,即分布式存储器。它可以生成只读存储器(ROM),单端口、简单双端口和双端口随机存取存储器(RAM),且生成的存储器支持16-65536字的数据深度,和1-1024位的数据宽度。xilinx_dist_sdpram_0o......
  • IP核学习之判断自定义ram与xilinx_sdpram_00reg_64x36IP核的功能是否一致
    xilinx_sdpram_00reg_64x36IP核是一个简单的64个地址,每个地址存36位数据且没有输出寄存器的双端口ram,以下是自定义ram的代码,接口与该IP核的接口设定一致:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.NUMERIC_STD.ALL;entitysdpram_64x36_testisPort(......
  • codesys将自定义的功能块或者函数保存到本地库
    将通过ST代码实现的自定义功能保存到codesys的本地库,其他project可以直接实现调用。提高灵活性和效率。1、创建库工程 这里可能会提示涉及个别库没有安装或版本更新,根据提示安装对应库或更新即可。2、添加功能块和函数3、编写功能块和函数的参数定义及逻辑实现    ......
  • Qt自定义插件plugin的开发和调用
    1.需求描述设备管理组件保存了设备信息和通道信息到sqlite数据库,其他组件也想要访问这个数据库中的内容;需要开发一个自定义插件,用于提供接口给其他组件访问数据库; 开发环境vs2015+Qt5.9.62.插件介绍插件主要面向接口编程,通过接口实现功能的扩展,而不需要访问.lib文件。插件在......
  • PbootCMS留言自定义表单怎么调用
    在PBootCMS中,你可以通过自定义表单和标签来实现留言功能。以下是详细的步骤和示例代码,帮助你在全站任意地方使用留言表单和留言记录列表。1.留言提交表单示例代码<formaction="{pboot:msgaction}"method="post">联系人:<inputtype="text"name="contacts"require......
  • 自定义穿梭框封装
      后面有时间再来慢慢搞吧,暂且先这样,有需要的可以把代码考过去继续弄<template><divid="app"><divclass="f-transferflex"><!--left--><divclass="f-left"><divclass="f-topflexflex-jus......
  • 自定义WPF滑块样式-Slider
    在Windows应用程序开发中,滑块(Slider)是一个非常常见且有用的控件。它可以让用户通过拖动滑块来选择一个范围内的值。然而,WPF或UWP应用程序中的默认滑块样式可能并不总是符合我们的设计需求。因此,我们需要自定义滑块的样式。在本文中,我将向你展示如何使用XAML(ExtensibleApplicat......