Odin语言读取大型Gzip文本文件:逐行读取实现疑问
Odin读取大型Gzip文件逐行处理方案
你的问题核心是误将压缩后的原始文件内容加载到了bytes.Buffer中,而非解压后的明文数据,导致bufio读取的是压缩字节,无法解析成行。以下是正确的实现方式:
正确思路
不要直接把压缩文件加载到buffer,而是使用gzip.Reader流式读取并解压文件,再通过bufio.Reader逐行处理,这样既节省内存(适合大型文件),又能正确解析文本行。
完整代码示例
package main import "core:fmt" import "core:io" import "core:bufio" import "core:gzip" import "core:context" main :: proc() { // 打开原始gzip文件 file, err := io.open_file("example.gzip", io.READ_ONLY) if err != nil { fmt.eprintf("Failed to open file: %v\n", err) return } defer io.close_file(file) // 创建gzip解压读取器 gz_reader: gzip.Reader err = gzip.reader_init(&gz_reader, io.file_to_stream(file), context.allocator) if err != nil { fmt.eprintf("Failed to init gzip reader: %v\n", err) return } defer gzip.reader_destroy(&gz_reader) // 创建bufio行读取器 buf_reader: bufio.Reader buf: [4096]byte // 可根据文件大小调整缓冲区大小 bufio.reader_init(&buf_reader, gzip.reader_to_stream(&gz_reader), buf[:]) defer bufio.reader_destroy(&buf_reader) // 逐行读取解压后的内容 for { line, err := bufio.reader_read_string(&buf_reader, '\n', context.allocator) if err != nil { if err != io.EOF { fmt.eprintf("Error reading line: %v\n", err) } break } defer delete(line, context.allocator) fmt.println(line) } }
关键修正点
- 直接操作原始gzip文件流,避免一次性加载大型文件占满内存
- 使用
gzip.Reader处理解压逻辑,而非gzip.load_from_file(后者仅读取压缩后的原始字节) - 将
gzip.Reader转换为流后传入bufio.Reader,实现对解压后明文的逐行读取
内容的提问来源于stack exchange,提问作者Miguel Silva
相关产品推荐
相关产品推荐

