浏览器如何处理大数据量的文件?

问题描述:

最近有个需求需要对超过1G的文件进行处理,例如生成布隆过滤器文件等,由于文件是在本地,需要本地上传到服务端去处理,由于数据量比较大,对网络的压力比较大,所以考虑是否可以在本地进行处理完然后再上传。
注: 处理完的数据比较小,约几十M

解题方法:

本地处理的方法如下:
1. 提供一个本地的数据处理小工具(与语言无关),然后处理完成的数据进行上传;
2. 通过浏览期进行处理,处理完然后上传;
对比1和2, 其中1实现比较简单,但是需要兼容多种系统,同时用户使用有成本,所以选用2方式实现,2只需要用户使用浏览器就可以

浏览器的web api提供了FileReader对象,允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
由于数据量比较大,采用异步读取的方式,每次读取固定的大小的文件,通过readAsArrayBuffer() 方法用于启动读取指定的 Blob 或 File 内容。当读取操作完成时,readyState 变成 DONE(已完成),并触发 loadend 事件,同时 result 属性中将包含一个 ArrayBuffer 对象以表示所读取文件的数据。具体见https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>处理大数据量文件</title>
	</head>
	<body>
		<input type="file" id="file" placeholder="选择文件"/>
		<button id="bloom-filter">生成布隆过滤器</button>
		<button onclick="saveToFile()">保存文件</button>
		<!-- <button onclick="getFileHandle()">保存文件为</button> -->
	</body>
	<script src="https://github.com/jasondavies/bloomfilter.js/blob/master/bloomfilter.js" type="text/javascript" charset="utf-8"></script>
	<!-- js文件可以下载引入或npm引入 -->
	<script>
		var bloom = new BloomFilter(
		  32 * 256, // number of bits to allocate.
		  16        // number of hash functions.
		);
		var prev = ''
	    document.getElementById('bloom-filter').onclick = function () {
	        let file = document.getElementById('file').files[0];
	        let fr = new FileReader();
	        let CHUNK_SIZE = 10 * 1024;
	        let startTime, endTime;
	        let reverse = false;
	        fr.onload = function () {
	            let buffer = new Uint8Array(fr.result);
				let txt = new TextDecoder('utf-8').decode(buffer.slice())
				let arr = txt.split(/[(\r\n)\r\n]+/);
				let len = arr.length - 1
				arr.forEach((item, index)=>{
					if (index == 0) {
						item = prev + item
					}
					if (index == len && item != "") {
						prev = item
					} else {
						bloom.add(item)
					}
				})
				var bloomTxt = toJson()
				wirteToFile(bloomTxt)
	        }
	        segment();
	        function segment() {
	            let start = reverse ? file.size - CHUNK_SIZE : 0;
	            let end = reverse ? file.size : CHUNK_SIZE;
	            let slice = file.slice(start, end);
	            fr.readAsArrayBuffer(slice);
	        }
	    }
		
		function toJson() {
			var array = [].slice.call(bloom.buckets),
			    json = JSON.stringify(array);
			return json
		}
		
		function saveToFile() {
			var textFileAsBlob = new Blob([toJson()], {type:'text/plain'});
			var downloadLink = document.createElement("a");
			downloadLink.download = 'test.txt';
			downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
			downloadLink.click();
		}
		async function getFileHandle() {
			const opts = {
				type: 'save-file',
				accepts: [{
					description: 'Text file',
					
					extensions: ['txt'],
					
					mimeTypes: ['text/plain'],
			    }],
			}
			// 参考链接 https://wicg.github.io/entries-api/ chooseFileSystemEntries方法浏览器未发布
			fileHandle = await window.chooseFileSystemEntries(opts);			
		}
		async function wirteToFile(txt) {
			if (!fileHandle) {
				return
			}
			const writable = await fileHandle.createWritable();
			await writable.write(txt);
			await writable.close()
		}
	</script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浏览器的excel文件预览功能是指通过浏览器直接打开excel文件,并在浏览器窗口中显示文件内容,而不需要下载并使用本地的excel软件来打开文件。这种方便的预览功能节省了用户的时间和下载空间。 许多主流浏览器如Chrome、Firefox和Edge都支持excel文件的预览功能。一般情况下,只需点击链接或者在浏览器中直接拖拽excel文件浏览器将自动预览文件内容。预览的excel文件可以在浏览器中进行滚动、缩放和选择单元格等操作,类似于在本地excel软件中的操作。 在excel文件预览的过程中,浏览器会将文件内容解析并进行渲染,以及根据文件中的样式和格式来显示内容。这样用户不仅可以看到excel文件的文本内容,还可以查看文件中的图表、公式和其他特定格式。 然而,需要注意的是,浏览器预览excel文件的功能有一定的局限性。一些复杂的excel文件,特别是包含大数据和复杂公式的文件,在浏览器中可能无法完全显示和运行。因此,对于需要对excel文件进行详细编辑和复杂操作的用户,建议仍然使用本地的excel软件来处理文件。 总结起来,浏览器的excel文件预览功能能够提供一种快速方便的浏览excel文件的方式,节省了用户下载和安装本地excel软件的时间和空间,但对于复杂的文件操作还是需要使用本地软件来获得更好的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值