数据生成器
使用场景- 数据集非常的大不可能一次性全部加载进内存或是显卡- 我们会实行按需加载的政策按照批量逐步加载数据- 解决大数据加载及处理面临的诸多的问题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(filedataset.csv, moder, encodingutf8) 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构建数据生成器的运用import java.util.stream.*; public class DataGeneratorDemo { public static void main(String[] args) { // 1. 流式数据源惰性求值按需产出 try (StreamString 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 StreamString 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逐条产出、逐条消费内存中永远只保留当前正在处理的那一条。

相关新闻