readAsText和readAsArrayBuffer方法之间内存使用的差异



I plant通过使用input-type=file HTML元素上传本地文件。

在我上传到服务器之前。。。我必须检查CSV文件中是否有重要的列标题。

所以我试着做这个

const validFileRow = (event) => {
const [file] = event.target.files;
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = (evtReader) => {
const data = evtReader.target.result;
const ui8a = new Uint8Array(data);
const byteLength = data.byteLength;
let rowString = '';
for (let i = 0; i < byteLength; i++) {
let char = String.fromCharCode(ui8a[i]);
if (char.match(/[^rn]+/g) !== null) {
rowString += char;
} else {
break;
}
}
};
};

但是,我有疑问。

  1. 在节省内存方面,readAsArrayBuffer和readAsText之间有什么区别吗
  2. 和我一样,如果我使用uint8Array方法加载整个文件(省略偏移量、长度(,它最终会将整个文件保存在内存中,所以它不节省内存吗

readAsText方法在处理完整文件之前将其加载到内存中。当文件大小变大并超过资源限制时,尤其是在浏览器环境中处理时,这可能是一个问题。几KB是可以的,但随着文件越来越大,性能问题和崩溃只是时间问题。

readAsArrayBuffer方法将二进制数组中提供的数据存储在RAM中。此功能允许您一次处理数据的定义部分,而无需将整个文件加载到内存中,也不会使浏览器或计算机崩溃。这里提供了一个使用splice方法的工作流程,用于需要节省内存的较大文件。

如果我使用uint8Array方法(省略偏移量、长度(加载整个文件,它最终会将整个文件保存在内存中,所以它不节省内存吗正确。如果使用uint8Array8加载整个文件,它将尝试将整个文件保存在工作内存中。然而,这不是必要的,因为文件的数据可以按照上面链接的方法分解为离散的数据块。

最新更新