数据生成器

使用场景

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

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

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

python构建生成器及其运用

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构建数据生成器的运用

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,逐条产出、逐条消费,内存中永远只保留当前正在处理的那一条。

相关推荐
chenbingjie_c7 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu8 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
实心儿儿8 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶8 小时前
【Java】数据类型与变量
java·开发语言
code斗8 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特8 小时前
【C++进阶】map和set
java·开发语言·c++
lie..9 小时前
30天从零开始学AI应用开发(Day 12):像产品一样稳:流式输出、报错重试、花钱控制
开发语言·人工智能·php
傻啦嘿哟9 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
DeepAgent9 小时前
AI Agent 工程实践(49):一次真实优化——从 Agent v1 到 v2
开发语言·人工智能·agent
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习