数据生成器

使用场景

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

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

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

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

相关推荐
互联网中的一颗神经元1 天前
小白python入门 - 39. 采集流水线小项目
开发语言·python
Wang's Blog1 天前
Go-Zero 项目开发22:用户群聊功能的实现与完善
开发语言·golang
a1117761 天前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
Wang's Blog1 天前
Go-Zero项目开发24: 基于Bitmap实现群聊消息已读未读
开发语言·后端·golang
吃好睡好便好1 天前
MATLAB中图像的读取、写入和显示
开发语言·图像处理·学习·计算机视觉·matlab
yaoxin5211231 天前
476. Java 反射 - 调用方法
java·开发语言
猫头虎1 天前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作
bksczm1 天前
Linux之日志和线程池、内存池
java·开发语言
笨蛋不要掉眼泪1 天前
Java虚拟机:对象复活、引用强度与Stop-The-World
java·开发语言·jvm
code_pgf1 天前
C/C++ 常用容器功能汇总
c语言·开发语言·c++