@@ -591,11 +591,8 @@ def transient_search(
591591 if allvalues == []:
592592 allvalues = [0 ]
593593
594- all_results = []
595- all_freqs = []
596-
597594 dt = (times [- 1 ] - times [0 ]) / nprof
598-
595+ all_results = None
599596 for ii , i in enumerate (show_progress (allvalues )):
600597 offset = step * i
601598 fdot_offset = 0
@@ -605,8 +602,28 @@ def transient_search(
605602 nave , results = _transient_search_step (
606603 times , mean_f , mean_fdot = mean_fdot , nbin = nbin , nprof = nprof , n = n
607604 )
608- all_results .append (results )
609- all_freqs .append (mean_f )
605+ if all_results is None :
606+ results_shape = (len (allvalues ), nave .size , results .shape [1 ])
607+ if np .prod (results_shape ) > 1e7 :
608+ log .info (
609+ "Transient search results are very large. "
610+ f"Using memmapped arrays (shape { results_shape } ) to reduce memory usage." ,
611+ )
612+ import tempfile
613+ tmp_results = tempfile .NamedTemporaryFile (delete = True ).name
614+ tmp_f = tempfile .NamedTemporaryFile (delete = True ).name
615+ all_results = np .lib .format .open_memmap (
616+ tmp_results , mode = "w+" , dtype = results .dtype , shape = results_shape
617+ )
618+ all_freqs = np .lib .format .open_memmap (
619+ tmp_f , mode = "w+" , dtype = mean_f .dtype , shape = (len (allvalues ),)
620+ )
621+ else :
622+ all_results = np .empty (results_shape , dtype = results .dtype )
623+ all_freqs = np .empty ((len (allvalues ),), dtype = mean_f .dtype )
624+
625+ all_results [ii ] = results
626+ all_freqs [ii ] = mean_f
610627
611628 all_results = np .array (all_results )
612629 all_freqs = np .array (all_freqs )
0 commit comments