]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph.db/src/org/simantics/graph/db/StreamingTransferableGraphImportProcess.java
Less memory use for TG import when NamespaceMigrationStep is involved
[simantics/platform.git] / bundles / org.simantics.graph.db / src / org / simantics / graph / db / StreamingTransferableGraphImportProcess.java
index 3599eefc0ecc81c9cb6d012bf31415f48bcfc34f..524885f5d57a71ba291579c0942f1e0cdff3945f 100644 (file)
@@ -72,6 +72,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        TransferableGraphSource tg;
        VirtualGraph vg;
        IImportAdvisor2 advisor;
+       TGStatusMonitor monitor;
        ClusterBuilder2 builder;
        final TGResourceUtil resourceUtil = new TGResourceUtil();
 
@@ -99,9 +100,25 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        Resource NameOf;        
 
        public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor) {
+               this(session, vg, tg, advisor, null);
+       }
+
+       public StreamingTransferableGraphImportProcess(Session session, VirtualGraph vg, TransferableGraphSource tg, IImportAdvisor2 advisor, TGStatusMonitor monitor) {
                this.tg = tg;
                this.vg = vg;
                this.advisor = advisor;
+               this.monitor = monitor;
+       }
+
+       private int updatePercentage(int percentage, int done, int total) {
+               if (monitor != null && (done & 63) == 0) {
+                       int current = 100*done / total;
+                       if (current > percentage) {
+                               percentage = current;
+                               monitor.status(percentage);
+                       }
+               }
+               return percentage;
        }
 
        public void readIdentities(ReadGraph g) throws Exception {
@@ -459,8 +476,11 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                }
                        }
                }               
-               
-               tg.getStatementCount();
+
+               int[] done = { 0 };
+               int[] percentage = { 0 };
+
+               int statementCount = tg.getStatementCount();
                tg.forStatements(null, new TransferableGraphSourceProcedure<int[]>() {
 
                        @Override
@@ -480,13 +500,17 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                                    int inverse = handles[inv];
                                    builder.addStatement(graph, object, inverse, subject);    
                                }
-                               
+
+                               // Count from 0% -> 50% => total = statementCount*2
+                               percentage[0] = updatePercentage(percentage[0], done[0]++, statementCount*2);
+               
                        }
                        
                }); 
                
-               tg.getValueCount();
-               
+               int valueCount = tg.getValueCount();
+               done[0] = 0;
+
                class ValueProcedure extends InputStream implements TransferableGraphSourceValueProcedure {
 
             private TGResourceUtil util = new TGResourceUtil();
@@ -526,7 +550,8 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                     s.skip(this);
                 }
                 builder.endValue();
-                
+                work();
+
             }
 
             @Override
@@ -546,8 +571,13 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                 for (int i = 0; i < length; ++i)
                     builder.appendValue(input.readUnsignedByte());
                 builder.endValue();
+                work();
             }
 
+            private void work() {
+                // Count from 50% -> 100% => [valueCount, valueCount*2)
+                percentage[0] = updatePercentage(percentage[0], valueCount + done[0]++, valueCount*2);
+            }
                };
                
                tg.forValues2(null, new ValueProcedure());