From 9926bb54cb171a0e76fb295b542349379ed6a218 Mon Sep 17 00:00:00 2001 From: Brandon Rhodes Date: Sun, 22 Jul 2018 16:16:43 -0400 Subject: [PATCH] Version 2.8: single memory map instead of many --- jplephem/__init__.py | 6 ++++++ jplephem/daf.py | 10 +++++++--- setup.py | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/jplephem/__init__.py b/jplephem/__init__.py index 4dcf8db..e4c9f08 100644 --- a/jplephem/__init__.py +++ b/jplephem/__init__.py @@ -298,6 +298,12 @@ https://github.com/brandon-rhodes/python-jplephem/ Changelog --------- +**2018 July 22 — Version 2.8** + +* Switched to a making a single memory map of the entire file, to avoid + running out of file descriptors when users load an ephemeris with + hundreds of segments. + **2018 February 11 — Version 2.7** * Expanded the command line tool, most notably with the ability to fetch diff --git a/jplephem/daf.py b/jplephem/daf.py index 3119283..ce75875 100644 --- a/jplephem/daf.py +++ b/jplephem/daf.py @@ -27,6 +27,8 @@ class DAF(object): raise ValueError('file_object must be opened in binary "b" mode') self.file = file_object + self._map = None + self._array = None file_record = self.read_record(1) @@ -151,9 +153,11 @@ class DAF(object): you need random access. """ - data, skip = self.map_words(start, end) - skip //= 8 - return ndarray(end - start + 1 + skip, self.endian + 'd', data)[skip:] + if self._array is None: + self._map, skip = self.map_words(1, self.free - 1) + assert skip == 0 + self._array = ndarray(self.free - 1, self.endian + 'd', self._map) + return self._array[start - 1 : end] def summary_records(self): """Yield (record_number, n_summaries, record_data) for each record. diff --git a/setup.py b/setup.py index c406bb2..e475b64 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ import jplephem description, long_description = jplephem.__doc__.split('\n', 1) setup(name = 'jplephem', - version = '2.7', + version = '2.8', description = description, long_description = long_description, license = 'MIT',