Skip to content

Commit 43c66af

Browse files
committed
Support reader.get_working_set_size
1 parent fae43ce commit 43c66af

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

libcachesim/protocols.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def skip_n_req(self, n: int) -> int: ...
2828
def reset(self) -> None: ...
2929
def close(self) -> None: ...
3030
def clone(self) -> "ReaderProtocol": ...
31+
def get_working_set_size(self) -> tuple[int, int]: ...
3132
def __iter__(self) -> Iterator[Request]: ...
3233
def __next__(self) -> Request: ...
3334
def __len__(self) -> int: ...

libcachesim/synthetic_reader.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,15 @@ def set_read_pos(self, pos: float) -> None:
181181
def get_read_pos(self) -> float:
182182
"""Get current read position"""
183183
return float(self.current_pos)
184+
185+
def get_working_set_size(self) -> tuple[int, int]:
186+
"""Calculate working set size"""
187+
wss_obj, wss_byte = 0, 0
188+
if self._obj_ids is not None:
189+
unique_ids = np.unique(self._obj_ids[:self.current_pos])
190+
wss_obj = len(unique_ids)
191+
wss_byte = wss_obj * self.obj_size
192+
return wss_obj, wss_byte
184193

185194
def __iter__(self) -> Iterator[Request]:
186195
"""Iterator implementation"""

libcachesim/trace_reader.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
"""Wrapper of Reader with S3 support."""
22

33
import logging
4-
from typing import overload, Union, Optional
4+
from typing import Tuple, overload, Union, Optional
55
from collections.abc import Iterator
66
from urllib.parse import urlparse
77

88
from .protocols import ReaderProtocol
9-
from .libcachesim_python import TraceType, SamplerType, Request, ReaderInitParam, Reader, Sampler, ReadDirection
9+
from .libcachesim_python import TraceType, SamplerType, Request, ReaderInitParam, Reader, Sampler, ReadDirection, cal_working_set_size
1010
from ._s3_cache import get_data_loader
1111

1212
logger = logging.getLogger(__name__)
@@ -276,6 +276,9 @@ def go_back_one_req(self) -> None:
276276
def set_read_pos(self, pos: float) -> None:
277277
self._reader.set_read_pos(pos)
278278

279+
def get_working_set_size(self) -> Tuple[int, int]:
280+
return cal_working_set_size(self._reader)
281+
279282
def __iter__(self) -> Iterator[Request]:
280283
self._reader.reset()
281284
return self

src/export_reader.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,15 @@ struct SamplerDeleter {
6161
}
6262
};
6363

64+
6465
void export_reader(py::module& m) {
66+
/* Helper function(s) */
67+
m.def("cal_working_set_size", [](reader_t& reader) {
68+
int64_t wss_obj = 0, wss_byte = 0;
69+
cal_working_set_size(&reader, &wss_obj, &wss_byte);
70+
return std::make_tuple(wss_obj, wss_byte);
71+
}, "reader"_a);
72+
6573
// Sampler type enumeration
6674
py::enum_<sampler_type>(m, "SamplerType")
6775
.value("SPATIAL_SAMPLER", sampler_type::SPATIAL_SAMPLER)

0 commit comments

Comments
 (0)