开发中遇到了需要写入大量数据到InfluxDB measurement的问题,使用HTTP写入有Header的大小限制,且速度很慢,连接中出现不稳定的情况直接报废所有导入操作。针对这种情况找到了两种解决方案:一是通过将数据文件通过batch的方式批量导入到数据库;二是直接将文件导入到InfluxDB中。
1. 将文件使用文件流的方式分为多个batch写入数据库,这种方案依然只适合较小体积的文件,写入速度依然较慢,具体方法可以参考以下代码:
CHUNKSIZE = 50 // 可以测试自己的接口单个batch的容量为多少进行调整
// 该函数用于js内的大文件读取和写入数据库
function readLargeFileAsChunks(filename, db) {
let that = this;
const fileStream = fs.createReadStream(filename, {encoding: 'utf8'});
let remainingData = '';
fileStream.on('data', async data => {
// 将上一个batch中剩余的数据和下一个batch合并到一起
const lines = (remainingData + data.toString()).split('\n');
remainingData = lines.pop(); // 最后一行可能是不完整的
if (lines.length <= CHUNKSIZE) {
await that.writeData(lines.join('\n'), db);
} else {