使用JavaScript的高效内存哈希数组

使用JavaScript的高效内存哈希数组,javascript,arrays,Javascript,Arrays,假设我有一个JavaScript中一些基本对象的数组: [ {a: 'something', b: 'something else', c: 'other' }, {a: 'something 2', b: 'something else 2', c: 'other 2' }, // etc. ] 当我接触到数十万个这样的对象时,Node.js下的内存使用量已经达到了千兆字节。我怎样才能提高效率 每个对象的所有键都将是相同的,但不一定以相同的顺序填充。我想我可以转换为数组数组,但

假设我有一个JavaScript中一些基本对象的数组:

[
  {a: 'something', b: 'something else', c: 'other' },
  {a: 'something 2', b: 'something else 2', c: 'other 2' },
  // etc.
]
当我接触到数十万个这样的对象时,Node.js下的内存使用量已经达到了千兆字节。我怎样才能提高效率

  • 每个对象的所有键都将是相同的,但不一定以相同的顺序填充。我想我可以转换为数组数组,但是在所有来回转换中都会有开销
  • 我提前知道对象中每个值的类型
有什么现成的内存表结构可以使用吗


我曾考虑在内存中使用SQLite3,但它的非原子特性阻止我在应用程序中使用它。也许有一些原生JS替代方案,这样我也可以在浏览器中重复使用它?

使用一个数组,您可以使用该数组为每个对象建立3个对象边界的索引

data = ['something', 'something else', 'other', 'something 2', 'something else 2', 'other 2'];

function getObjectAt(index){
 var offset = index * 3;
 return { a : data[offset], b : data[offset + 1],  c : data[offset + 2]};
}
内存占用应该更小,当然还有很多OTS解决方案,如Redis或hbase。

对于智能分页算法服务器端来说,“几十万”是一项任务,并有一个数据库作为支持


当ajax调用需要时,您可以从服务器加载对象页面,当未使用时,可以立即删除它们

我认为您的问题可能不是“如何压缩这些内存中的对象”,而是“如何将这些未使用的变量存储在内存之外,并在需要时获取它们”。我有点怀疑你一次需要几十万个这样的对象。或者我错了吗?{code>{a:['something','something 2'],b:['something','something 2'],c:[…]}?这是非常小的。。。1个对象,3个属性,3个数组,所有的值(不能使用小于存储值的值)@Jan我肯定有办法在应用程序之外存储这些值,但这正是我试图避免的。想象一下一个应用程序,它可以检查数百万个URL的可用性。数据量相对较小,不需要长期存储。为该任务添加一个小型数据库或类似数据库的依赖项会让人感觉过火。SQLite是。。原子的(ACID中的A),什么是“非原子”位?我认为如果你长期需要它,或者当你完成它时应该删除它,这并不重要,需要几GB的免费客户端内存来完成你所谓的“小”任务,这对用户来说不是很好,而且会让你的应用程序变得脆弱。除非仅在具有特定保证RAM规格的生产机器上运行。只需将搜索/执行限制为每个用户一次,在他们发起新的“搜索”或用户注销时删除旧数据,然后您就可以轻松实现数据的AJAX分页或诸如此类的功能。这也是我所想的一种变体。我不在这里构建web应用程序。我希望找到一种适用于任何JS应用程序的技术,但我的即时用例与web应用程序无关。考虑一个cron工作或类似的任务。这是个不错的主意。我想我会这么做的。很简单。酷,让我知道进展如何。