2017-01-16 2 views
4

Я использую NodeJS для вставки 8.000.000 записей в мою базу данных orientdb, но после того, как в 2000 000 записей вставки мое приложение остановлено и отображается ошибка «Java Heap».OrientDB - не освобождать память после вставки

Есть ли способ освободить память после каждой вставленной записи?

Ram usage:
-befor start app: 2.6g
-after insert 2milions records: 7.6g

Мои app.js (NodeJS):

var dbConn = []; 
var dbNext = 0; 
var dbMax = 25; 

for (var i = 0; i <= dbMax; i++) { 
    var db = new ODatabase({ 
     host: orientdb.host, 
     port: 2424, 
     username: 'root', 
     password: orientdb.password, 
     name: 'test', 
    }); 
    dbConn.push(db); 
} 
//--------------------------------------------------- 
//Start loop 
// record = {name: 'test'} 
record["@class"] = "table"; 
var db = nextDB(); 
db.open().then(function() { 
    return db.record.create(record); 
}).then(function (res) { 
    db.close().then(function() { 
      //----resume loop 
    }); 
    }).error(function (err) { 
      //------ 
    }); 
// end loop - iteration loop 
//--------------------------------------------------- 
function nextDB() { 
    if (++dbNext >= dbMax) { 
     dbNext -= dbMax; 
    } 
    return dbConn[dbNext]; 
} 

ответ

1

OrientJS не был эффективным для вставки массивных данных от SqlServer до OrientDB , Я использовал ETL module для массивной вставки, что является самым быстрым способом и хорошей идеей для массовых данных transpot без увеличения объема памяти более 2 ГБ.
Я мог перевозить 7000 записей в минуту. config.json

Мой ETL в:

{ 
    "config": { 
    log : "debug" 
    }, 
    "extractor" : { 
    "jdbc": { "driver": "com.microsoft.sqlserver.jdbc.SQLServerDriver", 
       "url": "jdbc:sqlserver://10.10.10.10;databaseName=My_DB;", 
       "userName": "sa", 
       "userPassword": "123", 
       "query": "select * from My_Table" 
      } 
    }, 

    "transformers" : [ 
    { "vertex": { "class": "Company"} } 
    ], 
    "loader" : { 
    "orientdb": { 
     "dbURL": "plocal:D:\DB\Orient_DB", 
     dbUser: "admin", 
     dbPassword: "admin", 
     "dbAutoCreate": true, 
     "tx": false, 
     "batchCommit": 1000, 
     "wal" : false, 
     "dbType": "graph" 
    } 
    } 
} 
0

Из documentation, для массированного вставки вы должны объявить о своем намерении:

db.declareIntent(new OIntentMassiveInsert()); 
// YOUR MASSIVE INSERTION  
db.declareIntent(null); 

Но теперь он, похоже, не реализуется в драйвере orientJS. Другое дело, что вам не следует открывать/закрывать базу данных для каждой созданной новой записи. Это, в общем, плохая практика.

Я не окружение Node.js теперь, но что-то вроде этого следует сделать трюк:

db.open().then(function() { 
    // when available // db.declareIntent(new OIntentMassiveInsert()); 
    for (var i = 0; i < 8000000; i++) { 
    // create a new record 
    myRecord = { "@class" : "myClass", "attributePosition" : i }; 
    db.record.create(myRecord); 
    } 
    // when available // db.declareIntent(null); 

}).then(function() { db.close() }); 
+1

У меня есть эта ошибка: "OIntentMassiveInsert не определен" –

+0

ли 'Var OIntentMassiveInsert = Требовать ('') orientjs OIntentMassiveInsert;' работает.? – TrapII

+1

У меня есть другая ошибка: 'TypeError: OIntentMassiveInsert не является конструктором –

Смежные вопросы