数据生成器

使用场景

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

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

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

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

相关推荐
SomeOtherTime几秒前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔11 分钟前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆32 分钟前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
Hvitur2 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J2 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪2 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂2 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫3 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
apcipot_rain7 小时前
C++转Java日记(06)
java·开发语言