Facepalm**2: fix array-read-slice, like actually..
We need to subtract the first index in the array segment read, not the first index value in the time-sliced output, to get the correct offset into the non-absolute (`ShmArray.array` read) array.. Further we **do** need the `&` between the advance indexing conditions and this adds profiling to see that it is indeed real slow (like 20ms ish even when using `np.where()`).epoch_index_backup
							parent
							
								
									a2f75a83b6
								
							
						
					
					
						commit
						2e6f14afb3
					
				| 
						 | 
				
			
			@ -48,6 +48,10 @@ from ._sharedmem import (
 | 
			
		|||
from ._sampling import (
 | 
			
		||||
    iter_ohlc_periods,
 | 
			
		||||
)
 | 
			
		||||
from .._profile import (
 | 
			
		||||
    Profiler,
 | 
			
		||||
    pg_profile_enabled,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
    from pyqtgraph import PlotItem
 | 
			
		||||
| 
						 | 
				
			
			@ -264,6 +268,13 @@ class Flume(Struct):
 | 
			
		|||
        for the caller to use to slice the input array if needed.
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
        profiler = Profiler(
 | 
			
		||||
            msg='Flume.slice_from_time()',
 | 
			
		||||
            disabled=not pg_profile_enabled(),
 | 
			
		||||
            ms_threshold=4,
 | 
			
		||||
            # ms_threshold=ms_slower_then,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        times = arr['time']
 | 
			
		||||
        index = arr['index']
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -285,12 +296,12 @@ class Flume(Struct):
 | 
			
		|||
 | 
			
		||||
        # use advanced indexing to map the
 | 
			
		||||
        # time range to the index range.
 | 
			
		||||
        mask: np.ndarray = (
 | 
			
		||||
        mask: np.ndarray = np.where(
 | 
			
		||||
            (times >= start_t)
 | 
			
		||||
            |  # fml, i guess it's not an `&` ??
 | 
			
		||||
            &
 | 
			
		||||
            (times < stop_t)
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        profiler('advanced indexing slice')
 | 
			
		||||
        # TODO: if we can ensure each time field has a uniform
 | 
			
		||||
        # step we can instead do some arithmetic to determine
 | 
			
		||||
        # the equivalent index like we used to?
 | 
			
		||||
| 
						 | 
				
			
			@ -302,6 +313,8 @@ class Flume(Struct):
 | 
			
		|||
        i_by_t = index[mask]
 | 
			
		||||
        try:
 | 
			
		||||
            i_0 = i_by_t[0]
 | 
			
		||||
            i_last = i_by_t[-1]
 | 
			
		||||
            i_first_read = index[0]
 | 
			
		||||
        except IndexError:
 | 
			
		||||
            if (
 | 
			
		||||
                start_t < times[0]
 | 
			
		||||
| 
						 | 
				
			
			@ -319,17 +332,20 @@ class Flume(Struct):
 | 
			
		|||
                    None,
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
        abs_slc = slice(
 | 
			
		||||
            i_0,
 | 
			
		||||
            i_by_t[-1],
 | 
			
		||||
        )
 | 
			
		||||
        abs_slc = slice(i_0, i_last)
 | 
			
		||||
 | 
			
		||||
        # slice data by offset from the first index
 | 
			
		||||
        # available in the passed datum set.
 | 
			
		||||
        read_slc = slice(
 | 
			
		||||
            i_0 - index[0],
 | 
			
		||||
            i_by_t[-1] - i_0,
 | 
			
		||||
            i_0 - i_first_read,
 | 
			
		||||
            i_last - i_first_read + 1,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        profiler(
 | 
			
		||||
            'slicing complete'
 | 
			
		||||
            f'{start_t} -> {abs_slc.start} | {read_slc.start}\n'
 | 
			
		||||
            f'{stop_t} -> {abs_slc.stop} | {read_slc.stop}\n'
 | 
			
		||||
        )
 | 
			
		||||
        # also return the readable data from the timerange
 | 
			
		||||
        return (
 | 
			
		||||
            abs_slc,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue