Skip to content

Commit 3fcd1f5

Browse files
authored
Merge pull request #98 from HydrologicEngineeringCenter/cumulus_speedup
Grid write performance boost
2 parents 0e9f3c3 + 6d55f43 commit 3fcd1f5

File tree

4 files changed

+11
-18
lines changed

4 files changed

+11
-18
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "hec-dss-python"
3-
version = "0.1.24"
3+
version = "0.1.25"
44
description = "Python wrapper for the HEC-DSS file database C library."
55
authors = ["Hydrologic Engineering Center"]
66
license = "MIT"

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = hecdss
3-
version = 0.1.24
3+
version = 0.1.25
44
author = Hydrologic Engineering Center
55
author_email =hec.dss@usace.army.mil
66
description = Python wrapper for the HEC-DSS file database C library.

src/hecdss/gridded_data.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,24 +102,17 @@ def range_limit_table(self, minval, maxval, range_, bins, datasize, data):
102102
if bins > max_bins:
103103
bins = max_bins
104104

105-
self.rangeLimitTable = [0] * bins
106-
self.numberEqualOrExceedingRangeLimit = [0] * bins
107-
105+
self.rangeLimitTable = np.empty(bins, dtype=float)
108106
self.rangeLimitTable[0] = NULL_INT
109107
self.rangeLimitTable[1] = minval
110108

111109
step = range_ / bins
112-
113-
for i in range(2, bins):
114-
self.rangeLimitTable[i] = minval + step * i
110+
self.rangeLimitTable[2:] = minval + step * np.arange(2, bins)
115111

116112
self.rangeLimitTable[bins - 1] = maxval
117113
# Exceedance
118-
sorted_data = np.sort(data)
119-
n = len(sorted_data)
120-
for jdx in range(bins):
121-
idx = np.searchsorted(sorted_data, self.rangeLimitTable[jdx], side="left")
122-
self.numberEqualOrExceedingRangeLimit[jdx] = n - idx
114+
mask = data[None, :] >= self.rangeLimitTable[:, None]
115+
self.numberEqualOrExceedingRangeLimit = mask.sum(axis=1)
123116

124117
def update_grid_info(self):
125118
"""
@@ -134,8 +127,8 @@ def update_grid_info(self):
134127
self.meanDataValue = np.nanmean(self.data)
135128

136129
self.data = np.nan_to_num(self.data, nan=NULL_INT)
137-
self.numberOfRanges = math.floor(1 + 3.322 * math.log10(n) + 1)
138-
flat_data = self.data.ravel()
130+
self.numberOfRanges = math.floor(2 + 3.322 * math.log10(n))
131+
flat_data = self.data.flatten()
139132
self.range_limit_table(self.minDataValue, self.maxDataValue, bin_range, self.numberOfRanges, n, flat_data)
140133

141134
@staticmethod

src/hecdss/native.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,6 @@ def hec_dss_gridStore(
331331
self,
332332
gd,
333333
):
334-
335334
self.dll.hec_dss_pdStore.restype = c_int
336335
self.dll.hec_dss_pdStore.argtypes = [
337336
ctypes.POINTER(ctypes.c_void_p), # dss (dss file pointer)
@@ -395,8 +394,9 @@ def hec_dss_gridStore(
395394
c_rangeLimitTable = (c_float * len(gd.rangeLimitTable))(*gd.rangeLimitTable)
396395
c_numberEqualOrExceedingRangeLimit = (c_int * len(gd.numberEqualOrExceedingRangeLimit))(
397396
*gd.numberEqualOrExceedingRangeLimit)
398-
flat_list = gd.data.flatten()
399-
c_data = (c_float * len(flat_list))(*flat_list)
397+
398+
arr = gd.data.astype('float32', copy=False)
399+
c_data = arr.ctypes.data_as(ctypes.POINTER(ctypes.c_float))
400400

401401
return self.dll.hec_dss_gridStore(self.handle, c_pathname, c_gridType, c_dataType,
402402
c_lowerLeftCellX, c_lowerLeftCellY,

0 commit comments

Comments
 (0)