sqlite3中的批量插入 - 内存问题

时间:2016-04-23 18:59:54

标签: javascript html node.js memory sqlite

我有两个数据库,我正在从nodejs读取/更新。一个用HTML格式的新闻文章,另一个用于存储相同文章的干净文本版本。我目前有一个脚本(下面的代码),它从html db读取,提取干净的文本,并将其保存到文本db。

我遇到的问题是,虽然这个脚本适用于有限数量的行,但当我尝试在整个数据库上运行它时,最终会占用整个内存(+ 7GB)。

我注意到所有插入实际上最终都是一起执行的,所以我认为我需要在运行时执行插入操作,以便在仍然从html db中读取行时释放内存。

关于如何做到这一点的任何想法?谢谢!

/**
 *  Process all articles; extract text from html and save to database.
 */
dbText.run("CREATE TABLE IF NOT EXISTS articles (url string primary key, headline text, subhead text, copy text)");
dbHtml.each("SELECT * FROM articles", function(err, row) {
  processArticle(row.url, row.content, dbText);
});

/**
 *  Function called on each article.
 */
function processArticle(url, content, dbText) {
  $ = cheerio.load(content);
  var headlineElem = $(...);
  var subheadElem = $(...);
  var copyElem = $(...);

  var headlineText = headlineElem.length > 0 ? headlineElem.text() : "";
  var subheadText = subheadElem.length > 0 ? subheadElem.text() : "";
  var copyText = copyElem.length > 0 ? getTextWithSpaces(copyElem.get(0)) : "";

  if (!headlineText) log(url, "Headline is emtpy.");
  if (!subheadText) log(url, "Subhead is emtpy.");
  if (!copyText) log(url, "Copy is emtpy.");

  var statement = dbText.prepare("INSERT OR REPLACE INTO articles VALUES (?, ?, ?, ?)");
  statement.run(url, headlineText, subheadText, copyText);
  statement.finalize();
}

0 个答案:

没有答案