Skip to content

Rewrite MATLAB functions with matlab.io.xml.dom.*#351

Open
Jerry1144 wants to merge 1 commit into
trackmate-sc:masterfrom
Jerry1144:rewrite-in-xml-dom
Open

Rewrite MATLAB functions with matlab.io.xml.dom.*#351
Jerry1144 wants to merge 1 commit into
trackmate-sc:masterfrom
Jerry1144:rewrite-in-xml-dom

Conversation

@Jerry1144

Copy link
Copy Markdown

Rewrite with matlab.io.xml.dom.* facilities, avoiding Java heap size problems. Available since R2021a. One path to #343. Force-push of #346

A detour from #345 - trackmateEdges requires one table per track node, but it isn't possible to express a parent node's attribute in XPath 1.0, and calling readtable() once per track is slow (50+h from my 16k track file).

Then, to keep the total memory use in check, all function in the series must adhere to a single path. Apparently memory reuse does not happen across readstruct, readtable, and matlab.io.xml.*, and GC only occurs during inactivity. Thus the total rewrite.

Finally, I eliminated all calls to str2double (one function call for each attribute for each node!), replacing them with the weird-looking double(string()) per Mathworks recommendation. Speed up is very significant. I also changed text preallocation to strings, with no noticeable impact.

PS: Text comparison still uses strcmp, which is faster than string's ==.
PPS: Why text preallocation using strings not brings improvements, is beyond me. I changed that only for aesthetic reasons.

Circumvent Java heap size problems with recent MATLAB dealing with large XML.

MATLAB's `io.xml.xpath.*` appears to execute eagerly and over-consumes memory
Walking the dom tree ourselves is slower than native `readtable()` when every
sub-node are consolidated into one big table, but the latter cannot easily
handle "one edge table per track" which is required by trackmateEdges.m

Also replaced every `str2double` with `double(string())` per recommendation.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant