| 1 | #!/usr/bin/env -S v -raw-vsh-tmp-prefix tmp |
| 2 | |
| 3 | module main |
| 4 | |
| 5 | import os |
| 6 | import log |
| 7 | |
| 8 | fn write_chunk(n int, min_size int, original string, start int, end int) { |
| 9 | size := end - start |
| 10 | if size < min_size { |
| 11 | return |
| 12 | } |
| 13 | frame_file := 'frame_${n:06}.bin' |
| 14 | log.warn('writing ${frame_file}, from start: ${start:9}, to end: ${end:9} | size: ${size:9} >= ${min_size:9}, memuse: ${gc_memory_use()}') |
| 15 | os.write_file(frame_file, original#[start..end]) or { log.error(err.str()) } |
| 16 | } |
| 17 | |
| 18 | fn main() { |
| 19 | log.info('Start.') |
| 20 | fpath := os.args[2] or { 'memdump.bin' } |
| 21 | separator := os.args[3] or { '@@ gg_memory_trace_frame' } |
| 22 | min_size := os.args[1] or { '${separator.len}' }.int() |
| 23 | log.info('Splitting chunk min_size (arg 1): ${min_size}, file (arg 2): ${fpath}, by string separator (arg 3): `${separator}` ...') |
| 24 | log.info('Memory use before reading: ${gc_memory_use()}') |
| 25 | original := os.read_file(fpath)! |
| 26 | log.info('file size: ${original.len}') |
| 27 | log.info('Memory use after reading: ${gc_memory_use()}') |
| 28 | mut n := 0 |
| 29 | for start := 0; start < original.len; { |
| 30 | gc_collect() |
| 31 | idx := |
| 32 | original.index_after_(separator, start + separator.len) // ensure that we advance each time |
| 33 | if idx < 0 { |
| 34 | write_chunk(n, min_size, original, start, original.len) |
| 35 | break |
| 36 | } |
| 37 | write_chunk(n, min_size, original, start, idx) |
| 38 | start = idx |
| 39 | n++ |
| 40 | } |
| 41 | log.info('Memory use after processing: ${gc_memory_use()}') |
| 42 | log.info('Done.') |
| 43 | } |
| 44 | |