数据生成器

使用场景

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

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

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

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

相关推荐
小灰灰搞电子28 分钟前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
传奇开心果编程2 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马2 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob2 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
白山编程大哥3 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡4 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
七夜zippoe4 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能
znnnk4 小时前
【Python】GUI 开发从入门到实战(三):PyQt/PySide 进阶之路
开发语言·python·pyqt
Despacito10065 小时前
Java后端性能探查工具速查表
java·开发语言
晊晌_h5 小时前
嵌入式从0到精通——Linux C|TCP 并发服务器实现方案详解
服务器·开发语言·tcp/ip