def combine_counters(work_dir, n_map_shards, n_reduce_shards): filenames = map(lambda (work_dir, shard): os.path.join(work_dir, 'map-%d.counters' % shard), zip([work_dir] * n_map_shards, range(n_map_shards))) filenames += map(lambda (work_dir, shard): os.path.join(work_dir, 'combine-%d.counters' % shard), zip([work_dir] * n_map_shards, range(n_map_shards))) filenames += map(lambda (work_dir, shard): os.path.join(work_dir, 'reduce-%d.counters' % shard), zip([work_dir] * n_reduce_shards, range(n_reduce_shards))) return MRCounter.sum( imap(MRCounter.deserialize, read_files(filter(os.path.exists, filenames))))