Hi Pavel,
After doing some research, with QuerySQLField and Indexes, also with the heap
size,
it seems that with each QuerySQLField the amount of memory needed is doubled by
the size of the
field.
All test are done by 3 Windows 2012R2 Nodes with Apache.Ignite 2.2 heap size
1GB per java switch
7.5 GB Data ASCII Textfiles
64 million rows of data
Key is a guid data type
So my assumption was that I need a little more than 21GB
7.5 GB of ASCII data -> 15GB of UTF data
64 million keys of Guid -> 1 GB
Cache overhead 3 * 300MB -> 1.2 GB
Static assigned Heap 1GB per Node -> 3 GB
--------------------------------
Sum 20.2 GB
test 1
data load with No QueryEntities defined. -> 21.4 GB used memory
test 2
data load with QueryEntities defined but no [QuerySQLField] attributes. -> 22.2
GB used memory
test 3
data load with QueryEntities defined and [QuerySQLField] attributes. -> 38,7 GB
used memory
After running test 3 it seems that when I use QuerySQLField then the memory
needed is doubled
by my estimation. The difference between test 2 and test 3 is 16.5 GB of memory
needed.
src:
DataItem this is the only class which is used. It’s a simple class for only
getting the data into the db.
public class DataItem : IBinarizable
{
[QuerySqlField(IsIndexed = true)]
public DateTime DateTime;
[QuerySqlField]
public short FracSec;
[QuerySqlField(IsIndexed = true)]
public string EventType = "";
[QuerySqlField(IsIndexed = true)]
public string Category = "";
[QuerySqlField(IsIndexed = true)]
public string Area = "";
[QuerySqlField]
public string Node = "";
[QuerySqlField]
public string Unit = "";
[QuerySqlField(IsIndexed = true)]
public string Module = "";
[QuerySqlField]
public string Module_Description = "";
[QuerySqlField]
public string Attribute = "";
[QuerySqlField(IsIndexed = true)]
public string State = "";
[QuerySqlField(IsIndexed = true)]
public string Level = "";
[QuerySqlField]
public string Desc1 = "";
[QuerySqlField]
public string Desc2 = "";
[QuerySqlField]
public string Desc3 = "";
[QuerySqlField]
public string Desc4 = "";
public void ReadBinary(IBinaryReader reader)
{
Area = reader.ReadString("Area");
Attribute = reader.ReadString("Attribute");
Category =reader.ReadString("Category");
DateTime? tmp = reader.ReadTimestamp("DateTime");
if (tmp.HasValue)
DateTime = tmp.Value;
Desc1 =reader.ReadString("Desc1");
Desc2=reader.ReadString("Desc2");
Desc3 =reader.ReadString("Desc3");
Desc4=reader.ReadString("Desc4");
EventType =reader.ReadString("EventType" );
FracSec= reader.ReadShort("FracSec");
Level=reader.ReadString("Level");
Module=reader.ReadString("Module");
Module_Description=reader.ReadString("Module_Description");
Node=reader.ReadString("Node");
State=reader.ReadString("State");
Unit=reader.ReadString("Unit");
}
public void WriteBinary(IBinaryWriter writer)
{
writer.WriteString("Area", Area);
writer.WriteString("Attribute", Attribute);
writer.WriteString("Category", Category);
writer.WriteTimestamp("DateTime", DateTime);
writer.WriteString("Desc1", Desc1);
writer.WriteString("Desc2", Desc2);
writer.WriteString("Desc3", Desc3);
writer.WriteString("Desc4", Desc4);
writer.WriteString("EventType", EventType);
writer.WriteShort("FracSec", FracSec);
writer.WriteString("Level", Level);
writer.WriteString("Module", Module);
writer.WriteString("Module_Description", Module_Description);
writer.WriteString("Node", Node);
writer.WriteString("State", State);
writer.WriteString("Unit", Unit);
}
}
Apache.Ignite.exe.config addition:
<igniteConfiguration
xmlns="http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection">
<!-- Customize Ignite configuration here. -->
<memoryConfiguration defaultMemoryPolicyName="meinTest">
<memoryPolicies>
<memoryPolicyConfiguration name="meinTest" initialSize="5368709120"
maxSize="10737418240"/>
</memoryPolicies>
</memoryConfiguration>
</igniteConfiguration>
DataLoader code cache configuration:
CacheConfiguration myAECache = new CacheConfiguration() ;
myAECache.CacheMode = CacheMode.Partitioned;
myAECache.WriteThrough = false;
myAECache.ReadThrough = false;
myAECache.Backups = 0;
myAECache.Name = Name + ".Events";
myAECache.QueryEntities = new List<QueryEntity>() { new
QueryEntity(typeof(DataItem)) };
myAECache.WriteSynchronizationMode = CacheWriteSynchronizationMode.FullAsync;
myAECache.AtomicityMode = CacheAtomicityMode.Atomic;
ICache<Guid, DataItem> AECache = db.CreateCache<Guid, DataItem>(myAECache);
var ldr = db.GetDataStreamer<Guid, DataItem>(myAECache.Name);
Thanks,
Mario
From: Pavel Tupitsyn [mailto:[email protected]]
Sent: Thursday, October 19, 2017 16:59
To: [email protected]
Subject: Re: Question Ignite Memory Consumption / Object size (Apache Ignite
.NET)
Hi Mario,
See
https://apacheignite.readme.io/docs/capacity-planning<https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapacheignite.readme.io%2Fdocs%2Fcapacity-planning&data=02%7C01%7CMElmers%40dow.com%7Cca42f7cc3d3140b4bbfb08d517020f02%7Cc3e32f53cb7f4809968d1cc4ccc785fe%7C0%7C0%7C636440219977766192&sdata=NyeKbTZ06Lqbi8HYZ2uxsj8UfPD22fxp29h3YCI0ACs%3D&reserved=0>
> Each field I have marked with the attribute [QuerySqlField] and some fields
> are indexed
This is most likely the case.
1) Have you tried loading data without enabling Ignite SQL (e.g. do not
configure CacheConfiguration.QueryEntities)?
2) Can you attach the class? How many fields are there?
Thanks,
Pavel
On Thu, Oct 19, 2017 at 1:57 PM, Elmers, Mario (M)
<[email protected]<mailto:[email protected]>> wrote:
Hello,
I try to estimate the needed RAM for my application. I have created 3 nodes by
starting only the Apache.Ignite.exe.
All is done with C# and Apache.Ignite 2.2
Then I created a data loader application which loads up the whole data of my
logfiles.
The size of all my logfiles are 7.5 GB. When I loaded it up to the Ignite
cluster all together need more than 32GB of RAM.
My cache is configured as partioned with 0 backups. So I hat thinked that the
cluster will need not much more than 16 GB of RAM.
Because the file are normal ASCII files which converted to UTF-8 it will twice
the amount of data needed to store.
The class file I have created has for each field of the logentry one field.
Each field I have marked with the attribute [QuerySqlField] and some fields
are indexed.
The key is of type Guid.
Can someone explain why the amount is 4x greater than the raw data ?
Thanks & regards
Mario