On Tuesday, 27 February 2018 at 16:55:27 UTC, Marc wrote:
[...]

So deep down the error is in that method which I call from deserializeLine() function:


void setValue(T, V)(auto ref T aggregate, string field, V value) {
                        writeln("setting {", field, "} to {", value, "}");
                    import std.traits : FieldNameTuple;
                    import std.meta : Alias;
                    switch (field) {
                        foreach (fieldName; FieldNameTuple!T) {
                            case fieldName:
static if (is(typeof(__traits(getMember, aggregate, fieldName) = value))) { __traits(getMember, aggregate, fieldName) = value;
                                    return;
                                } else {
assert(false, T.stringof ~ "."~field~" cannot be assigned from a "~V.stringof~".");
                                }
                        }
                        default:
assert(false, T.stringof ~ " has no field named "~field~".");
                    }
                }


the function is used like this:

                        Field field = new Field();
                        foreach(CSVLinkedIndex linkedIndex; linkedIndexes) {
                                string value = 
values[linkedIndex.csv_column_index];
                                setValue(field, linkedIndex.field_member, 
value);
                        }

which eventually (in about 8 calls) return the error:

core.exception.OutOfMemoryError@src\core\exception.d(702): Memory allocation failed

it uses about 4MB in a 8GB machine then crashs. It's return by the top function using yield:

yield(field);

But I can't find out why gc fails to allocate at some point. In fact, I've forced the gc to do so in my top loop:

foreach(Field field; deserializeFile()) {
scope(exit) {
        import core.memory : GC;                
       GC.collect();
}
}

Which didn't solve the issue.

Reply via email to