Source code for meersolar.crystalball.budget

from loguru import logger as log
import psutil
import numpy as np


[docs] def get_budget(nr_sources, nr_rows, nr_chans, nr_corrs, data_type, cb_args, fudge_factor=1.25, row2source_ratio=100): systmem = float(psutil.virtual_memory()[0]) if not cb_args.num_workers: nrthreads = psutil.cpu_count() else: nrthreads = cb_args.num_workers log.info('-' * 50) log.info('Budgeting') log.info('-' * 50) log.info('system RAM = {0:.2f} GB', systmem / 1024**3) log.info('nr of logical CPUs = {0:d}', nrthreads) log.info('nr sources = {0:d}', nr_sources) log.info('nr rows = {0:d}', nr_rows) log.info('nr chans = {0:d}', nr_chans) log.info('nr corrs = {0:d}', nr_corrs) data_type = {'complex': 'complex64', 'dcomplex': 'complex128'}[data_type] data_bytes = np.dtype(data_type).itemsize bytes_per_row = nr_chans * nr_corrs * data_bytes memory_per_row = bytes_per_row * fudge_factor if cb_args.model_chunks and cb_args.row_chunks: rows_per_chunk = cb_args.row_chunks sources_per_chunk = cb_args.model_chunks strat_type = "(user settings)" elif not cb_args.model_chunks and not cb_args.row_chunks: if cb_args.memory_fraction > 1 or cb_args.memory_fraction <= 0: raise ValueError('The memory fraction must be a number in the ' 'interval (0,1]. You have set it to {0:f} ' '.'.format(cb_args.memory_fraction)) allowed_rows_per_thread = (systmem * cb_args.memory_fraction / (memory_per_row * nrthreads)) rows_per_chunk = int(min(nr_rows, allowed_rows_per_thread)) sources_per_chunk = int(min(nr_sources, rows_per_chunk / row2source_ratio)) strat_type = "(auto settings)" else: raise ValueError('For now you must set both row and source chunk, or ' 'leave both unset (=0); ' 'you cannot set only one of them.') log.info('sources per chunk = {0:.0f} {1}', sources_per_chunk, strat_type) log.info('rows per chunk = {0:.0f} {1}', rows_per_chunk, strat_type) memory_usage = (rows_per_chunk * memory_per_row * nrthreads + sources_per_chunk) log.info('expected memory usage = {0:.2f} GB', memory_usage / 1024**3) return rows_per_chunk, sources_per_chunk