☰
数据生成器
2026/10/11 19:57:02 网站建设 项目流程

使用场景

- 数据集非常的大,不可能一次性全部加载进内存或是显卡;

- 我们会实行按需加载的政策,按照批量,逐步加载数据;

- 解决大数据加载及处理面临的诸多的问题

python构建生成器及其运用

# 构建生成器方法一 # yield 返回 def get_data(): ls = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for ele in ls: yield ele gen1 = get_data() for ele in gen1: print(ele) # 构建生成器方法二 ls = list(range(10)) [ele for ele in ls if ele % 2 == 1] gen2 = (ele for ele in ls if ele % 2 == 1) for ele in gen2: print(ele) # 运用生成器读取数据集 def get_dataset(): with open(file="dataset.csv", mode="r", encoding="utf8") as f: line = f.readline() while True: line = f.readline().strip() if line: yield line else: break gen3 = get_dataset() for ele in gen3: print(ele)

java构建数据生成器的运用

import java.util.stream.*; public class DataGeneratorDemo { public static void main(String[] args) { // 1. 流式数据源:惰性求值,按需产出 try (Stream<String> stream = dataStream()) { // 2. 逐条读取,直接打印 stream.forEach(System.out::println); } } /** * 流式数据源:惰性求值,按需产出数据,不会一次性加载全部数据到内存。 * * 实际场景中,数据源可以是: * * 1. 从OSS下载压缩文件,解压后逐行读取某个日志文件 * 例:从 device_log.tar.gz 中读取 can_log_20260707.log 的部分行 * → 用 InputStream 逐行读取,每 readLine() 产出一条数据 * → 即使日志文件有10GB,内存中也只保留当前这一行 * * 2. 从数据库游标查询大表 * → 用 MyBatis Cursor 或 JDBC ResultSet 逐行遍历 * → 避免 SELECT * 把百万数据一次性加载到内存 * * 3. 从消息队列逐条消费 * → Kafka Consumer 每次 poll() 产出一批数据 * → 逐条处理,处理完即可释放 * * 4. 从HTTP响应体流式读取 * → 大文件下载时,用 InputStream 分块读取 * → 每读一块就处理一块,不需要把整个文件下载到本地 */ static Stream<String> dataStream() { // 示例:模拟从压缩文件中的某个日志文件逐行读取数据 // 实际代码等价于: // InputStream is = downloadFromOSS("device_log.tar.gz/can_log_20260707.log"); // BufferedReader reader = new BufferedReader(new InputStreamReader(is)); // return reader.lines(); // 每调用一次 next() 才读取下一行 return IntStream.rangeClosed(1, 10) .mapToObj(i -> "payload-" + i); } }

总结:

不管数据来自哪里(压缩文件、数据库、消息队列、HTTP),都抽象成一个 Stream,逐条产出、逐条消费,内存中永远只保留当前正在处理的那一条。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询