diff --git a/README.md b/README.md index f16c5bb3a119acba4bff0e34b4ebad80c1e57bbe..c1d9c38e5416221d7ecccf76542cf1cebdce1880 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Then copy your resulting wheel and install it via pip on the target system. ## v0.5.3 -* _TBA_ +* added `disable_mmap` and `enable_mmap` into `VarlenSeries` ## v0.5.2 diff --git a/tempsdb/varlen.pxd b/tempsdb/varlen.pxd index b3ee95c882947cb4c81f0ef0fb759a07dbee7bee..ac2feb9d2ceebb0ee837dd92b9bd0f59ec7fc698 100644 --- a/tempsdb/varlen.pxd +++ b/tempsdb/varlen.pxd @@ -16,7 +16,10 @@ cdef class VarlenSeries: int current_maximum_length object mpm int gzip_level + bint mmap_enabled + cpdef int enable_mmap(self) except -1 + cpdef int disable_mmap(self) except -1 cpdef int mark_synced_up_to(self, unsigned long long timestamp) except -1 cpdef int close(self, bint force=*) except -1 cpdef int delete(self) except -1 @@ -68,4 +71,5 @@ cdef class VarlenEntry: cpdef VarlenSeries create_varlen_series(str path, str name, int size_struct, list length_profile, int max_entries_per_chunk, + bint use_descriptor_based_access=*, int gzip_level=*) diff --git a/tempsdb/varlen.pyx b/tempsdb/varlen.pyx index 6021039ef538db800cec00a617bd72fbb3f3b99f..f381b956e4165dea5f4af7b52bb72207c19e4b27 100644 --- a/tempsdb/varlen.pyx +++ b/tempsdb/varlen.pyx @@ -486,13 +486,15 @@ cdef class VarlenSeries: et.close() it.close() - def __init__(self, path: str, name: str): + def __init__(self, path: str, name: str, use_descriptor_based_access: bool = False): self.closed = False + self.mmap_enabled = not use_descriptor_based_access self.path = path self.references = 0 self.mpm = None self.name = name - self.root_series = TimeSeries(os.path.join(path, 'root'), 'root') + self.root_series = TimeSeries(os.path.join(path, 'root'), 'root', + use_descriptor_based_access=not self.mmap_enabled) self.gzip_level = self.root_series.gzip_level self.max_entries_per_chunk = self.root_series.max_entries_per_chunk try: @@ -532,10 +534,31 @@ cdef class VarlenSeries: for dir_name in sub_series: tot_length += self.get_length_for(i) i += 1 - self.series.append(TimeSeries(os.path.join(path, dir_name), dir_name)) + self.series.append(TimeSeries(os.path.join(path, dir_name), dir_name, + use_descriptor_based_access=not self.mmap_enabled)) self.current_maximum_length = tot_length + cpdef int enable_mmap(self) except -1: + """ + Enable using mmap for these series + """ + self.mmap_enabled = True + cdef TimeSeries series + for series in self.series: + series.enable_mmap() + return 0 + + cpdef int disable_mmap(self) except -1: + """ + Disable using mmap for these series + """ + self.mmap_enabled = False + cdef TimeSeries series + for series in self.series: + series.disable_mmap() + return 0 + cpdef int mark_synced_up_to(self, unsigned long long timestamp) except -1: """ Mark the series as synchronized up to particular period @@ -613,6 +636,7 @@ cdef class VarlenSeries: new_name_s, new_len, self.max_entries_per_chunk, + use_descriptor_based_access=not self.mmap_enabled, gzip_level=self.gzip_level) if self.mpm is not None: series.register_memory_pressure_manager(self.mpm) @@ -679,6 +703,7 @@ from tempsdb.series cimport TimeSeries cpdef VarlenSeries create_varlen_series(str path, str name, int size_struct, list length_profile, int max_entries_per_chunk, + bint use_descriptor_based_access=False, int gzip_level=0): """ Create a variable length series @@ -688,6 +713,7 @@ cpdef VarlenSeries create_varlen_series(str path, str name, int size_struct, lis :param size_struct: size of the length indicator. Must be one of 1, 2, 3 or 4. :param length_profile: series' length profile :param max_entries_per_chunk: maximum entries per a chunk file + :param use_descriptor_based_access: whether to disable mmap :param gzip_level: level of gzip compression. Leave at 0 (default) to disable compression. :return: newly created VarlenSeries :raises AlreadyExists: directory exists at given path @@ -707,6 +733,7 @@ cpdef VarlenSeries create_varlen_series(str path, str name, int size_struct, lis 'root', size_struct+length_profile[0], max_entries_per_chunk, + use_descriptor_based_access=use_descriptor_based_access, gzip_level=gzip_level) root_series.set_metadata({'size_field': size_struct, 'length_profile': length_profile})