代码之家  ›  专栏  ›  技术社区  ›  Mtxz

用于执行大数据脚本的Javascript变量与对象存储

  •  0
  • Mtxz  · 技术社区  · 6 年前

    这个脚本调用一些xml文件,并存储结果以供以后使用(我输出转换并输出,然后处理它以便能够将其导入数据库)。

    因此,这个脚本将生成一个数组,其中包含成千上万个小JS对象(来自XML解析)。

    由于脚本需要很长时间才能运行,我在URL数组上循环(我有一个所有文件URL的列表),并将查询结果存储到一个经典的JS变量中,并在jsonEncode之后进行本地存储。因为它是JSON编码的,所以每次都会删除localStorage值,并为同一个键保存一个新的更大的字符串。

    我的问题是:

    • 只使用经典变量更好吗?还是只在本地存储?

    从我的测试来看,在查询了3-4k个文件并存储了结果之后,浏览器开始放慢很多速度,并大大减少了HTTP请求/分钟的数量。

    谢谢!

    笔记:

    • 它必须在浏览器中运行(我需要一些动态的DOM数据,它是一个显示统计信息的内部仪表板,用户可以输入实时设置)。
    • 它只需要在最新的Chrome或Firefox上运行
    1 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Wilms    6 年前

    每次都会删除localStorage值,并为同一个键保存一个新的更大字符串。

      class PersistentArray  {
        constructor(name) {
          this.name = name;
          this.length = +localStorage.getItem(name) || 0;
        }
    
        push(value) {
         set(this.length, value);
        }
    
        set(index, value) {
          if(index >= this.length)
            localStorage.setItem(this.name, this.length = index + 1);
          localStorage.setItem(this.name + index, JSON.stringify(value));
        }
    
        get(index) {
          return JSON.parse(localStorage.getItem(this.name + index));
        }
    
        *[Symbol.iterator] () {
           for(let i = 0; i < this.length; i++)
               yield this.get(i);
        }
     }
    

    这样,您可以轻松地将值推送到:

      const pages = new PersistentArray("pages");
    
      // ... somewhen
      pages.push({ value: "whatever" });
    

    当所有数据都存在时:

      // Turn into a real in memoy array:
      const result = [...pages];
    
      // Dynamically load:
      for(const page of pages) 
        console.log(page);