v / cmd / tools / gg_split_memdump_to_frames.vsh
43 lines · 39 sloc · 1.36 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1#!/usr/bin/env -S v -raw-vsh-tmp-prefix tmp
2
3module main
4
5import os
6import log
7
8fn 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
18fn 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