数据生成器

使用场景

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

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

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

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

相关推荐
wuyk555几秒前
第 6 章 FOC 完整系统整合:从算法到真机跑起来
c语言·开发语言·stm32·单片机·嵌入式硬件
luj_17684 分钟前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场6 分钟前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
东华万里8 分钟前
第40篇 C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·大学生专区
程序员雷欧24 分钟前
AQS深度解析
开发语言·python
yujunl1 小时前
总结一下U9客开的成果
开发语言
独隅1 小时前
KMP 全栈进化:Koog 框架打造纯 Kotlin AI Agent 实战效果
开发语言·人工智能·kotlin
lhldsg1 小时前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
SomeB1oody2 小时前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程
Evand J3 小时前
【MATLAB例程,PDR11】二维平面下的PDR(行人航位推算)步态检测与EKF融合定位,附代码的下载链接
开发语言·matlab·平面·pdr·行人导航·步态检测