in src/rosbridge/timeseq.py [0:0]
def scan_trace(dir, channels, sample_cb):
manifest_fn = path.join(dir, 'manifest.json')
with open(manifest_fn, 'rb') as f:
manifest = ujson.load(f)
if 0: print manifest
begin_ts = manifest['beginTs']
end_ts = manifest['endTs']
print 'range', begin_ts, end_ts
timeseq_infos = manifest['timeseqInfos']
cur_samples = {}
# There's some thought to saving memory here. Only load a chunk (of all timeseqs) at a time
for chunk in get_chunks(begin_ts, end_ts):
all_chunk_data = {}
all_chunk_indexes = {}
for tsi in timeseq_infos:
ts_name = tsi['name'];
if ('*' not in channels) and (ts_name not in channels): continue
chunk_fn = path.join(dir, 'chunk_%s_%d.json.gz' % (ts_name, chunk))
try:
with gzip.open(chunk_fn, 'rb') as f:
print 'Reading', chunk_fn, '...'
all_chunk_data[ts_name] = ujson.load(f)
all_chunk_indexes[ts_name] = 0
except:
print chunk_fn, 'not found'
if ts_name in all_chunk_data:
del all_chunk_data[ts_name]
del all_chunk_indexes[ts_name]
while True:
# Find the next item to change (smallest timestamp)
cur_ts = end_ts + 1
for ts_name in all_chunk_data:
if all_chunk_indexes[ts_name] < len(all_chunk_data[ts_name]['times']):
ts1 = all_chunk_data[ts_name]['times'][all_chunk_indexes[ts_name]]
cur_ts = min(cur_ts, ts1)
if cur_ts > end_ts: # Didn't find anything
break
# Now update cur_samples with all samples with matching timestamps
for ts_name in all_chunk_data:
if all_chunk_indexes[ts_name] < len(all_chunk_data[ts_name]['times']):
ts1 = all_chunk_data[ts_name]['times'][all_chunk_indexes[ts_name]]
if ts1 == cur_ts:
cur_samples[ts_name] = all_chunk_data[ts_name]['samples'][all_chunk_indexes[ts_name]]
all_chunk_indexes[ts_name] += 1
# We copy so that customers can keep a copy that works after we mutate cur_samples again
# scan_trace_deltat does this
sample_cb(cur_ts, copy.copy(cur_samples))