]> 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 48cebf342c2cfe5566a3fb325bd33994437b20f7..c802f8b749adfd186776c36782d48464760b7f25 100644 (file)
@@ -93,6 +93,7 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        TransferableGraphSource tg;
        VirtualGraph vg;
        IImportAdvisor2 advisor;
+       TGStatusMonitor monitor;
        ClusterBuilder2 builder;
        final TGResourceUtil resourceUtil = new TGResourceUtil();
        
@@ -114,13 +115,29 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
        Resource PartOf;
        Resource HasName;
        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 {
                extensions = tg.getExtensions();
                resourceCount = tg.getResourceCount();
@@ -465,8 +482,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
@@ -486,12 +506,16 @@ 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 {
 
@@ -532,7 +556,8 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                     s.skip(this);
                 }
                 builder.endValue();
-                
+                worked();
+
             }
 
             @Override
@@ -552,8 +577,13 @@ public class StreamingTransferableGraphImportProcess implements TransferableGrap
                 for (int i = 0; i < length; ++i)
                     builder.appendValue(input.readUnsignedByte());
                 builder.endValue();
+                worked();
             }
 
+            private void worked() {
+                // Count from 50% -> 100% => [valueCount, valueCount*2)
+                percentage[0] = updatePercentage(percentage[0], valueCount + done[0]++, valueCount*2);
+            }
                };
                
                tg.forValues2(null, new ValueProcedure());