What is the memory usage of my app?

Adil via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Apr 17 00:30:03 PDT 2015


On Thursday, 16 April 2015 at 20:33:17 UTC, Marc Schütz wrote:
> On Thursday, 16 April 2015 at 17:13:25 UTC, Laeeth Isharc wrote:
>> For CSV files, what I found is that parsing is quite slow (and 
>> memory intensive).
>
> If your sure that CSV reading is the culprit, writing a custom 
> parser could help. It's possible to load a CSV file with almost 
> no memory overhead. What I would do:
>
> - Use std.mmfile with Mode.readCopyOnWrite to map the file into 
> memory.
> - Iterate over the lines, and then over the fields using 
> std.algorithm.splitter.
> - Don't copy, but return slices into the mapped memory.
> - If a field needs to be unescaped, this can be done in-place. 
> Unescaping never makes a string longer, and the original file 
> won't be modified thanks to COW (private mapping).

These are REALLY USEFUL optimizations! Thanks Marc.

Although, i'm still no better with the memory usage. I've reduced 
the application to just loading a CSV file into structs.

Here is void main :

````
void main(string[] args)
{
     auto text = readText(args[1]);

     foreach(record; csvReader!(string[string])(text, null))
     {
         if (!record["RIC"] || !record["TRBCIndCode"]) {
             continue;
         }

         // Add a Security to Securities
         securities.add(record["RIC"], record["TRBCIndCode"], 
record, []);
     }

     delete text;

     GC.collect();

     writefln("%d securities processed", securities.length);
     writefln("Securities : %d MB", securities.bytes/1024/1024);

     import core.thread;
     Thread.sleep(dur!"seconds"(60));
}
````

The output is :

````
make screener-d-simple; ./screener-d data/instruments-clean.csv

dmd -vgc -ofscreener-d source/simplemain.d source/lib/security.d
source/simplemain.d(30): vgc: indexing an associative array may 
cause GC allocation
source/simplemain.d(30): vgc: indexing an associative array may 
cause GC allocation
source/simplemain.d(35): vgc: indexing an associative array may 
cause GC allocation
source/simplemain.d(35): vgc: indexing an associative array may 
cause GC allocation
source/simplemain.d(38): vgc: 'delete' requires GC
source/lib/security.d(105): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(111): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(113): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(115): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(118): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(122): vgc: operator ~= may cause GC 
allocation
source/lib/security.d(123): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(164): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(164): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(173): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(173): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(182): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(182): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(191): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(191): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d(203): vgc: indexing an associative array 
may cause GC allocation
source/lib/security.d-mixin-213(213): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-213(213): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-219(219): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-219(219): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-225(225): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-225(225): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-231(231): vgc: indexing an 
associative array may cause GC allocation
source/lib/security.d-mixin-231(231): vgc: indexing an 
associative array may cause GC allocation

20066 securities processed
Securities : 188 MB
````

And yet memory usage is 617 MB.



More information about the Digitalmars-d-learn mailing list