提高大量数据的字典查找性能

时间:2015-02-24 22:37:58

标签: javascript json node.js performance

在将大量字符串与字典进行比较时(SOWPODS转换为JSON并通过开头字母拆分成文件),我在努力表现。

JSON文件当前存储在如下目录中:

words/
    a.json
    b.json
    ...
    z.json

我的代码中的'test'输入字符串会产生以下字符串数组。

[ 'test',
  'tes',
  'tet',
  'te',
  'tst',
  'ts',
  'tt',
  't',
  'est',
  'es',
  'et',
  'e',
  'st',
  's',
  'tets',
  'tts',
  'ets',
  'tset',
  'tse',
  'set',
  'se',
  'tste',
  'tte',
  'ste',
  'ttes',
  'ttse',
  'etst',
  'ett',
  'etts',
  'estt',
  'stt',
  'stet',
  'stte',
  'sett' ]

要确定要读取哪些文件,我会通过字母表循环检查输入字符串('test')中存在哪些字母,例如:

var i;
['a', 'b', ..., 'z'].forEach(function(letter) {
    i = input.indexOf(letter);
    if(i !== -1) {
        // letter exists, process [letter].json
        // avoid reading the same file twice
        input[i] = '';
    }
});

上述示例的文件为t.json, e.json, s.json

上述示例的计算时间仅为~0.08s,但随着数组中的字符串数量和处理的文件数量的增加而迅速增加。

在看到这个例子时,您是否有任何直接的表现助推器?我应该使用数据库吗?是否通过错误的选择开始将JSON拆分为文件?欢迎所有答案!

感谢您阅读本文!

1 个答案:

答案 0 :(得分:2)

嗯,是的,当然评估JSON文件会很慢。评估许多大型JSON文件的速度更慢。

您可以更好地查看HTML5网络数据库(http://docs.phonegap.com/en/edge/cordova_storage_storage.opendatabase.md.html)。据我所知,目前这只适用于Webkit浏览器,但它将及时全面实施。

作为替代方案,摆脱JSON以支持更容易解析的东西会稍微改善一些事情 - 但不要指望魔术结果。如果您要存储大量数据并进行查找,则需要一个真实的数据库。

更好的选择是摆脱所有客户端数据库逻辑,并使用AJAX调用服务器端的东西在那里的SQL数据库中查找。