Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
If you run a uModbus server that receives frequent and varying requests for an extended period of time, you will notice it uses more and more memory.
This is due to two reasons:
The
memoize
cache saves created messages, but they never expire.My quick fix to this is to stop using memoize.
Python's internal
struct.pack()
also has a cache, which also does not automatically expire. This is mentioned at https://bugs.python.org/issue14596 but oddly marked as fixed even though the issue remains.My quick fix to this is to use python's inherent list concatenation syntax instead of struct packing where possible. I replaced every use of struct.pack() where it concerned bytes, but kept struct.pack() for words (because manual endian handling is noisy).
These changes were enough to stop the memory leak in my system. I assume performance is affected but I haven't measured it.