Javascript 获取并解析一个大文件,然后获取下一个文件
我必须用ES6获取大约30个文件,每个文件由100MB的文本行组成 我逐行解析文本,计算一些数据点。结果是一个小数组,如Javascript 获取并解析一个大文件,然后获取下一个文件,javascript,garbage-collection,es6-promise,fetch-api,Javascript,Garbage Collection,Es6 Promise,Fetch Api,我必须用ES6获取大约30个文件,每个文件由100MB的文本行组成 我逐行解析文本,计算一些数据点。结果是一个小数组,如 [{"2014":34,"2015":34,"2016":34,"2017":34,"2018":12}] 我在解析文件时遇到内存问题(Chrome会使调试器崩溃),可能是因为我正在使用map解析所有文件: return Promise.all(filenamesArray.
[{"2014":34,"2015":34,"2016":34,"2017":34,"2018":12}]
我在解析文件时遇到内存问题(Chrome会使调试器崩溃),可能是因为我正在使用map解析所有文件:
return Promise.all(filenamesArray.map( /*fetch each file in filenamesArray */ )).
then(() => { /*parse them all */ })
我没有发布完整的代码,因为我知道它是错误的。我想做的是
//returns a promise resolving with an array of all processed files
loadAndCountFiles(filenamesArray) {
async function readFiles(filenamesArray) {
let resultArray = [];
for (const filename of filenamesArray) {
const response = await fetch(filename);
const text = await response.text();
//process the text and return a much smaller extract
const yearCountObject = processText(text);
resultArray.push({
filename: filename,
yearCountObject: yearCountObject
});
console.log("processed file " + filename);
}
return resultArray;
}
return new Promise(
(resolve, reject) => {
console.log("starting filecount...");
readFiles(filenamesArray)
.then(resultArray => {
console.log("done: " + resultArray);
resolve(resultArray);
})
.catch((error) => {
reject(error);
})
}
);
}
现在,每个文件都会在下一个文件之前被提取和处理。全局变量:
dictionary = {};
大体上:
fileNamesArray.forEach(fname => readFile(fname));
职能:
const readFile = (fname) => {
/* get file */.then(file => {
/* parse file */
addToDict(year); // year is a string. Call this when you find a year
})
}
const addToDict = (key) => {
if (dictionary[key]) dictionary[key]++;
else dictionary[key] = 1;
}
如果您的代码几乎正确怎么办?你想抛弃所有这些,让志愿者为你做所有的工作,因为这可能是错误的?而且,这一步的每一步都有很多问题;你对这些解决方案有疑问吗?异端猴子,我的代码有大约100行代码,我知道这是错的。它首先加载所有文件内容,然后以一种方式对其进行解析,然后再次加载文件,以另一种方式对其进行解析。几个小时以来,我一直在尝试用步骤1-5重新构造代码,但未能生成任何没有错误的代码。如果你真的想要,我会发布我的代码,但我真的认为阅读它对每个人来说都是浪费时间。我想我只需要一个步骤1,3,5的例子。如果我找到了我的最终解决方案,我很乐意发布。我不需要一个完整的解决方案,我的主要问题是我不知道如何获取和解析,将其标记为gc,然后获取下一个。可以说是同步异步的:)