Thanks Monte, Richard.
As it happens this script isn't doing with properties, which is good (or bad
since that potentially easy fix isn't available to me!) but that's a useful
tip to remember. I've already moved some very large functions to passing by
reference.
The real problem is that the script was written originally 13 years ago, and
the basic architecture was to load everything into large global arrays for
cleanliness. Over that period, the size of the data has multiplied over the
years by 1-2 orders of magnitude; and meanwhile the processing has been
modified and warped almost continuously, so it's a really complicated rats
nest. The whole project is reaching its sunset, so the client isn't keen to
invest in major refactoring... but just at this point we seem to be regularly
hitting this limit.
My two biggest problems are:
- LC just in effect crashes/halts, rather than throwing an error so the app
could at least report the problem
- as far as I can tell, when I empty globals etc the memory isn't being
recovered. This is really the root of my problem.
Ben
On 18/08/2016 00:26, Monte Goulding wrote:
There are certainly a number of tricks you can use to reduce the memory usage
of your app. One interesting one I learnt recently after an internal discussion
was because LiveCode copies values that have multiple reference when they are
mutated and custom properties are arrays linked to the object you can save some
memory by doing the following:
put the myProp of me into tVar
set the myProp of me to empty — here we are dereferencing the value so LiveCode
doesn’t do a deep copy
MutateVar tVar
set the myProp of me to tVar
Obviously there’s also passing by reference etc to reduce copies.
The other thing you want to look at doing here is processing data in chunks
rather than reading it all in.
Cheers
Monte
On 18 Aug 2016, at 3:52 AM, Ben Rubinstein <benr...@cogapp.com> wrote:
Please refresh my memory: is there any way to cause/allow garbage to be
collected without ending all script running?
I have an app which process large amounts of data. It runs fine on Mac, but on
Windows intermittently (but not frequently as the application data source,
which fluctuates, is gradually increasing) as the total memory in use
approaches 2GB, the app faults.
Obviously this is very distressing for me and my client, because the app has
lost control at this point and can't even tell us what's happening (it normally
runs on a schedule on a VM, so it often takes days to discover that the system
downstream hasn't been updated for a while, and trace back to find that the LC
app is halted).
I have managed to reduce the incidence of this by breaking the processing into
two parts, but this is undesirable for various reasons, and only palliative.
What I really want is a way for my main function to invoke garbage collection
after calling some of the larger processing steps.
Is there any way to do this? Am I right in thinking that the issue is related to LC's total memory
usage reaching 2GB on Windows? Are there any useful functions (e.g. the "hasMemory"
function is documented as "only partially implemented, and may not return useful values on
some platforms", which makes it seem pretty pointless...)?
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode