0

Web ワーカーを使用しようとすると、メモリ リークが発生します。4Gb RAM と i5 プロセッサを搭載しています。通常、CPU の 80% と 90% 近くに空き RAM がありますが、このスクリプトを実行すると、メモリがなくなる 2 分後にコンピューターがフリーズします。問題の調査方法がわかりません。いくつかのヒープ スナップショットを作成しましたが、問題は見つかりませんでした (メモリ リークの経験はありません)。誰でも私を助けることができますか?A は追加情報を提供できます。主なタスクは、素数を見つけてデータベースに保存することです。問題は、db の操作や、クライアントからワーカーへのデータの送信、またはその逆にある可能性があると思います。私の英語でごめんなさい。どうも

    $(document).ready( function() {
  $('#start_button').click( function() {
    toggleButton();
  });
});
var db = openDatabase("primeNumbers", "0.1", "Prime numbers db", 200000);

//check if db can be used
if(!db){alert("Failed to connect to database.");}

var currNumber = 2;
var work;

//create db if not exists
db.transaction(function (tx) {
  tx.executeSql("CREATE TABLE  IF NOT EXISTS primeNumbers (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, value INTEGER NOT NULL UNIQUE)", [], null, null);
});

//create worker for async calculations
var blob = new Blob([
  "                                                     \
  onmessage = function(event) {                         \
    self.postMessage(isPrime(parseInt(event.data)));    \
  };                                                    \
  function isPrime(n) {                                 \
    if(n < 2) return '{\"status\":\"false\"}';          \
    var q = parseInt(Math.sqrt(n));                     \
    for(var i = 2; i <= q; i++) {                       \
      if (n % i == 0) {                                 \
        return '{\"status\":\"false\"}';                \
      };                                                \
    };                                                  \
    return '{\"status\":\"true\",\"value\":\"'+n+'\"}'; \
  };"
]);
var blobURL = window.URL.createObjectURL(blob);
var worker = new Worker(blobURL);

//worker event listener
worker.onmessage = function(event) {
  json = $.parseJSON(event.data);
  switch(Boolean(json['status'])) {
    case true:
      writeDataToDatabase(json['value']);
      work && finder();
      break;
    case false:
      currNumber++;
      work && finder();
      break;
    default:
      alert('Something went wrong');
  };
};

function finder() {
  if(work) {
    worker.postMessage(currNumber);
    currNumber++;
  };
};

function writeDataToDatabase(value) {
  db.transaction(function(tx) {
    tx.executeSql('INSERT INTO primeNumbers (value) VALUES ('+ parseInt(value) +')');
  });
};

function getMaxPrimeFromDb() {
 var res;
 db.transaction(function(tx) {
   tx.executeSql('select max(value) as highestvalue from primenumbers', [], function(tx, result) {
     res = result.rows.item(0)['highestvalue'];
   });
   if(res != undefined) {
     currNumber = parseInt(res) + 1;
   };
 });
};

function toggleButton() {
  btn = $('#start_button');
  if(btn.text() != 'pause_calculations') {
    btn.text('pause_calculations');
    work = true;
    getMaxPrimeFromDb();
    finder();
  } else {
    btn.text('resume_calculations');
    work = false;
  };
};
4

1 に答える 1