我正在进行一些javascript 3D处理,并且我有非常大量的对象(比如对象A),每个对象包含一些东西和一组正整数,例如[0,1,4],[1,5 ,74,1013]等.它们不需要私有值,所有对象都可以共享相同的列表.数字可以从0到数千,比如说65k(短).
分析显示,阵列正在消耗大量内存.在计算时,我的程序达到了超过2GB的分配内存,这不是一些愚蠢的预优化.
我有2个用于内存优化的线索:
你有什么建议吗?
编辑:我忘了提它,但重要的是:列表中的每个整数都是UNIQUE.EDIT2:唯一需要检索的是整数的SET,顺序并不重要.
我正在考虑使用按位运算将thodes数组转换为"Big Integers",即使用某个类创建Big Integer,设置位1,5,74,1013,将big int转换为字符串(8字节的数组)并存储字符串,但它并不总是一个增益(例如,数组[4000]将表示为一个500字节长的字符串......)
项目范围(没用,但我被要求了)
这应该是无用的回答这个问题,但我已经多次被要求了,我把它放在这里.
我正在构建一个体积庞大的三维网格物体,为了简化,让我们假设我有很多球体.我知道他们的位置(中心,光线),我想在一个3D网格中绘制它们.为此,我有一个称为八叉树的记忆结构,允许我在我的对象表面周围的较低单元格(八叉树节点)中划分3D空间.然后我可以从细胞中构建网格.
Those单元格在我的描述中称为对象A. 每个单元格包含一个id列表(正整数),指向单元格相交的Sphere对象.
事实是,分析显示,单元格阵列在内存中保留了数百MB.我想减少这个数字,通过找到一种方法来删除所有重复项和/或如果可能的话,找到一种更有效的方法来存储肯定的id列表(可以从0到65k).
我有以下html:
<div class="main_container">
<div class="sub_container">
<div class="floating">wookie1</div>
...
<div class="floating">wookie5</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
考虑它就像一个图库.
main_container具有不固定的大小,它被设置为用户分辨率的百分比.我希望sub_container具有浮动div总和的确切宽度.
如果我使用"display:table;" for sub_container和"display:inline-block;" 对于浮动div,它工作正常:

直到我在列表中有足够的div,以便宽度的总和大于main_container并且它们在下一行中断:

但是,我仍然希望子容器(黄色背景)始终是div总和的完全宽度,即使它们在多行上都是这样的,如下所示:

我现在用谷歌搜索了几个小时,并且无法找到一个优雅的解决方案(如果可能的话,仅限css.)
这是jsfiddle,玩这个.
我正在开发一个Web应用程序,我打算使用鼠标和一些键盘快捷键,如果可能的话,使用模态键(Ctrl/ Shift/ Alt).
我注意到与现代浏览器/操作系统存在很多冲突.以下是您可能知道的一些示例:
我无法找到我可以在我的应用程序中安全使用的快捷键(使用模态键).是否有一个规则要遵循的列表?
如前所述这里,似乎清空现有阵列(不是分配一个新的)JavaScript中的最有效的方法是使用:
array.length = 0;
Run Code Online (Sandbox Code Playgroud)
相同的操作是否适用于普通对象?(又名"关联数组"或"字典")如果没有,清空现有javascript对象的最有效方法是什么?
我认为分配一个新的不是最好的选择,因为它会将一些额外的工作推送到垃圾收集器,并在堆上分配一些新的内存,但我可能错了.
我需要一个至少适用于Chrome和Firefox的解决方案.
我正在通过ajax请求实现一些文件上传功能.我希望能够在一个ajax调用中发送多个文件,所以我决定使用FormData.
我试图将我的二进制数据字符串直接附加到FormData(并且它可以工作),但Content-Disposition没有文件名属性:Content-Disposition:form-data; NAME = "文件1"
w3c说我需要将一个blob对象附加到formdata以具有该属性(或者能够使用FormData.append()的3rd属性设置它)
我写了以下代码:
function uploadAsBinary() {
var xhr = new XMLHttpRequest();
var fd = new FormData();
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
var bb = new window.BlobBuilder();
bb.append("this is my binary content");
var blob = bb.getBlob("text/plain");
fd.append("file1", blob, "file1");
xhr.open("POST", "/mb/0/", false);
xhr.send(fd);
}
Run Code Online (Sandbox Code Playgroud)
它与firefox完全兼容,但是使用谷歌浏览器(v16和v17),请求有效负载是一个没有内容的formdata:
------WebKitFormBoundaryVkgESMAGtmPMlPZ7
Content-Disposition: form-data; name="file1"; filename="file1"
Content-Type: text/plain
------WebKitFormBoundaryVkgESMAGtmPMlPZ7--
Run Code Online (Sandbox Code Playgroud)
我也尝试通过ArrayBuffer填充blob,结果相同.我已经在网上冲浪了2天,我找不到答案.我在Android上发现了一个未解决的问题(http://code.google.com/p/android/issues/detail?id=22441),但它似乎已经死了.
这是一个真正的铬问题吗?有人对此有所了解,还是应该在铬跟踪器上打开一个问题?
谢谢你的帮助!
假设您要在短代码中为列表中的每个文件夹启动(随机)进程:
var exec = require('child_process').exec;
var folders = [...]; // a list from somewhere
_.each(folders, function(folder) {
exec("tar cvf " + folder + ".tgz " + folder);
});
Run Code Online (Sandbox Code Playgroud)
如果列表很长,我可能最终会同时运行大量进程,这是应该避免的.以受控速率运行执行的相当简单的方法是什么(这里最多5个并发进程)?
编辑:该问题适用于各种异步流(您要在其中控制速率),而不仅仅是针对exec-over-folders问题.
我想移动一段我的代码,我在其中构建一个THREE.Geometry对象到HTML5 Web Worker.
因为我不想将它序列化为字符串(出于明显的性能目的),我想将它转换为可传输的对象,如ArrayBuffer,File或Blob,所以我可以"通过引用"传递它.
您是否知道将THREE.Geometry转换为其中一个对象的有效方法?
javascript ×5
arrays ×2
performance ×2
ajax ×1
arraybuffer ×1
asynchronous ×1
binary ×1
clear ×1
css ×1
dictionary ×1
exec ×1
html ×1
integer ×1
list ×1
loops ×1
optimization ×1
shortcut ×1
three.js ×1
web ×1
web-worker ×1
webkit ×1
width ×1