Hello,

Thanks for getting back to me, and for the tips on using the Has.. properties – 
I will certainly do that.

Is there a setting built in to switch from an in memory byte array to reading 
from disk, or is that something I would need to do implement in a custom build 
of cecil?

Richard

From: [email protected] <[email protected]> On Behalf Of Jb 
Evain
Sent: 15 October 2018 17:42
To: [email protected]
Subject: Re: [mono-cecil] Memory tips

Hey Richard,

Thanks for the kind words, always glad to read that Cecil is useful!

I don't think there's anything built-in that will help you more. Most metadata 
is lazy loaded on demand, so if you're using only a subset you should not 
consume too much memory. One useful pattern is to always use the HasN 
properties before accessing the N collection.

For instance:

if type.HasMethods
  foreach (var m in type.Methods)
    ...;

This prevents allocating empty collections if there's no methods in there.

If you want to dive into the internals, the parts of the binary that contains 
the metadata information (the heaps, 
https://github.com/jbevain/cecil/blob/master/Mono.Cecil.PE/ImageReader.cs#L367) 
will indeed be loaded in memory as a byte[] for fast access.

If you're very memory constrained you can change Cecil to always read on disk 
but you'll see a lot of seeking which is likely going to be slowish.

Jb



On Fri, Oct 12, 2018 at 8:59 AM rsuk 
<[email protected]<mailto:[email protected]>> wrote:
Firstly, a huge thank you - mono.cecil has been hugely useful and clearly you 
have invested a massive amount of work on it over the years.

I have completed an initial set of development using mono.cecil; using it only 
for inspecting type information, not generating assemblies, reading .pdb etc. 
I'm wondering if you might be able to offer any tips on reducing the memory 
usage? I have been experimenting with different reader parameters and have 
currently settled on:

InMemory = false,
ReadWrite = false,
ReadSymbols = false

We only use a fairly small subset of the properties available on the 
TypeReference, TypeDefinition etc., so I'm wondering if you might have any tips 
on how we might be able to minimize memory usage once we have loaded all the 
required AssemblyDefinitions; i.e. I'm wondering if it might be possible to 
discard some data held behind the scenes that might not be necessary in an 
inspection only scenario. Not necessarily looking for anything built in, maybe 
something we could implement in our own code to "prune" the object graph 
somehow to reduce the overall memory footprint.

One thing we have observed is that a large number of byte arrays are held in 
memory - does mono.cecil hold the raw metadata in memory and query on demand, 
or could this be data that is being held in memory for some other purpose - 
i.e. manipulating and writing assemblies. I wonder if might be possible to 
somehow remove that once we have completed the initial population of the 
objects?

Thanks for any pointers or tips you might be able to offer - much appreciated.

Richard
--
--
--
mono-cecil
---
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to 
[email protected]<mailto:[email protected]>.
For more options, visit https://groups.google.com/d/optout.
--
--
--
mono-cecil
---
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to 
[email protected]<mailto:[email protected]>.
For more options, visit https://groups.google.com/d/optout.

-- 
-- 
--
mono-cecil
--- 
You received this message because you are subscribed to the Google Groups 
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to