Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这段代码占用了这么多内存?_Javascript - Fatal编程技术网

Javascript 为什么这段代码占用了这么多内存?

Javascript 为什么这段代码占用了这么多内存?,javascript,Javascript,我开始解决一些codeeval测试,即使问题的速度分数一般都很好,但内存却很低 你能帮帮我吗?为什么这段代码使用了这么多内存(6392809内存,字节) 交换号码 挑战描述: 编写一个程序,给定一个句子,其中每个单词都有一个正整数作为前缀和后缀,交换数字,同时保留单词。句子中的单词用空格隔开 输入样本: 第一个参数是文件的路径。输入文件的每一行包含一个由句子表示的测试用例。句子中的每个单词都以一个正整数开始和结束,即0到9。假设所有字符都是ASCII 4Always0 5look8 4on9 7

我开始解决一些codeeval测试,即使问题的速度分数一般都很好,但内存却很低

你能帮帮我吗?为什么这段代码使用了这么多内存(6392809内存,字节)

交换号码 挑战描述:

编写一个程序,给定一个句子,其中每个单词都有一个正整数作为前缀和后缀,交换数字,同时保留单词。句子中的单词用空格隔开

输入样本:

第一个参数是文件的路径。输入文件的每一行包含一个由句子表示的测试用例。句子中的每个单词都以一个正整数开始和结束,即0到9。假设所有字符都是ASCII

4Always0 5look8 4on9 7the2 4bright8 9side7 3of8 5life5
5Nobody5 7expects3 5the4 6Spanish4 9inquisition0
输出样本:

对于每个测试用例,将通过交换每个单词周围的数字获得的句子打印到标准输出,每行一个

0Always4 8look5 9on4 2the7 8bright4 7side9 8of3 5life5
5Nobody5 3expects7 4the5 4Spanish6 0inquisition9
限制条件:

每个单词的后缀和前缀可以相等。 句子由1到17个单词组成。 测试用例的数量是40


我想尝试提高内存分数,欢迎任何提示。

我认为这将立即读取整个文件:
fs.readFileSync(process.argv[2]).toString()
,从而至少占用RAM中文件的大小


尝试一个。

而不是所有的代码,我建议使用正则表达式

不管你的文件大小

只需删除所有代码并使用以下命令:

.replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');
例如:

alert(“始终关注生命的光明面”\n\

任何人都不期望西班牙式的询问“替换(/(\d)([^\d]+)(\d)/g,'3$2$1')我敢打赌,您的问题在于将整个文件加载到内存中。其他人建议你以某种形式逐行阅读,但这可能没有帮助。测试人员只需一行就可以输入一个巨大的文件,但最终还是会占用大量内存。最好的方法是分块读取文件。使用
fs.readSync
(这里不需要异步的东西)。你们应该处理单词,这样你们就可以阅读块,用数字替换其中的单词,然后继续。当然,他们可能会在文件中放入一个巨大的单词,但这是下一个复杂程度。

可能文件太大,您会将整个文件加载到内存中。文件是104字节-输入采样器记住,如果文件是UTF8,RAM中的大小将加倍,因为每个字符都由两个字节组成。@Andrey根据经验,我知道UTF8保存的XML文件将是内存大小的两倍。我不知道ANSI文件。@IsmaelMiguel一切都很简单。JS在内部使用UTF-16,它几乎总是1个字符=2个字节。对于ASCII、latin1和w1252,它始终是每个字符1字节(因此UTF16加倍)。UTF-8每个字符有不同的字节长度。对于chars 0-128,比率也将为1-2。后来它变了。欧元符号在UTF-8中占用3个字节,在UTF-16中占用2个字节。感谢各位的回答。我将对此进行测试,并将结果反馈给您:)谢谢您的回答。我将对此进行测试,并将结果反馈给您。
.replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');