java - 基于哈希的分区

标签 java spring hash spring-batch

我想使用 Spring Batch 处理 CSV 文件。每个 CSV 文件每行包含一条记录。对于给定文件,某些记录可能是相互关联的,即此类记录的处理必须遵循它们在文件中出现的顺序。使用常规顺序方法(即整个文件的单线程)会产生糟糕的性能,因此我想使用分区功能。由于我的处理要求,相互关联的记录必须位于同一分区中(以及它们在文件中出现的顺序)。我考虑了使用基于哈希的分区算法和精心选择的哈希函数的想法(以便创建几乎相同大小的分区)。

知道 Spring Batch 是否可以做到这一点吗?

对于这种情况应该如何实现Partitioner?根据 Spring Batch 作者/开发人员之一的说法,主站不发送实际数据,仅发送从站获取其应处理的数据所需的信息。就我而言,我猜这个信息就是哈希值。因此,每个从站的 FlatFileItemReader 是否需要跳过具有不同哈希的行来逐行读取整个文件?

谢谢, 米凯尔

最佳答案

您所描述的是批处理中常见的情况。您在这里有几个选择:

  1. 按顺序拆分文件并根据创建的文件进行分区 - 在这种情况下,您需要遍历文件一次,将其划分为需要按顺序处理的每个记录列表。从那里,您可以使用 MultiResourcePartitioner 并行处理每个文件。
  2. 将文件加载到临时表中 - 恕我直言,这是更简单的方法。将文件加载到暂存表中。从那里,您可以根据任意数量的因素对处理进行分区。

无论哪种情况,结果都允许您根据需要扩展流程以获得所需的性能。

关于java - 基于哈希的分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362318/

相关文章:

Java语言--- -"file.java.swp"而不是 "file.java",导致 javac 无法识别?

java - 如何使用Spring MVC更新当前用户数据?

hash - 用户密码的 Golang Base64 编码 SHA256 摘要

javascript - 如何在 Typescript 中使用枚举键定义散列

java - Spring API 中的返回请求

php - 如何使用自定义登录表单比较 Laravel 的哈希密码?

java - mqtt 异常正在进行中的发布过多 (32202)

java - 如何使用java查找数组中相似元素的位置

Java - 通过 BlowFish 密码进行 2 字节字符加密

java - Hibernate一对一关系错误