CSV到Cloudant导入大数据集

时间:2020-04-22 12:36:01

标签: node.js csv amazon-s3 cloudant csvtojson

我正在研究基于Nodejs的脚本,以将大型csv文件导入ibm cloudant数据库。我对该脚本的处理方法如下:

  • 脚本1:使用FTP连接从远程服务器下载ZIP文件。
  • 脚本1:遍历下载的zip文件并从中提取CSV文件。
  • 脚本1:使用文件读写流将每个CSV文件上传到AWS S3存储桶。
  • Script2:连接到S3存储桶,并遍历在特定存储桶位置在那里找到的每个CSV文件。
  • 脚本2:使用流读取CSV文件,并通过管道将其转换为JSON格式的CSV数据。
  • 脚本2:连接到IBM cloudant数据库。
  • 脚本2:通过发出GET请求,对每个JSON对象逐一检查现有的cloudant文档。
  • 脚本2:如果找到了文档,则使用JSON对象进行更新,否则将作为新文档创建cloudant条目,并具有单独的API请求。
  • 脚本2:如果所有CSV数据都已成功迁移到cloudant数据库,则从S3存储桶中删除CSV文件。

到目前为止有效的方法:

  • 从FTP下载ZIP文件,然后从ZIP中提取CSV文件并将其上传到S3存储桶。
  • 如果仅在终端上打印每个转换后的JSON对象,则使用npm包“ csvtojson”将CSV文件读取为流并将其转换为JSON对象,就像魅力一样。
  • 成功连接到IBM cloudant数据库。

面临的问题:

  • 在试图检查每个JSON对象在cloudant处的现有记录的循环中,它只是越过很少的记录,并最终导致与内存/堆相关的错误,还存在cloudant速率限制的问题,因为它很快就会饱和查找和导入操作在循环内进行。

确切错误:

  • 致命错误:接近堆限制分配的无效标记压缩失败-JavaScript堆内存不足。
  • IBM Cloudant上的请求太多。

注意:

  • FTP服务器上可能有多个ZIP文件。
  • ZIP文件中可能有多个CSV文件。
  • 我一直尝试导入的CSV文件之一包含约130万条记录,文件大小约为300MB。
  • 对于这个要求,我没有办法考虑提高IBM Cloudant的速率限制。

有人可以提出解决此要求的最佳方法而又不会遇到我上面提到的问题吗?任何其他满足此要求的npm软件包也都受到欢迎。任何对我的开发方法进行更改的建议也将受到欢迎。

1 个答案:

答案 0 :(得分:0)

假设您的CSV行按ID排序,则可以先批量获取:

请求:

POST /db/_all_docs HTTP/1.1
Accept: application/json
Content-Length: 70
Content-Type: application/json
Host: localhost:5984

{
    "keys" : [
        "a_id123",
        "b_id123",
        "c_id123",
        "d_id123",
    ]
}

然后您将获得如下内容: 回复

{
    "total_rows" : 2666,
    "rows" : [
        {
            "value" : {
                "rev" : "1-a3544d296de19e6f5b932ea77d886942"
            },
            "id" : "a_id123",
            "key" : "a_id123"
        },
        {
            "value" : {
                "rev" : "1-91635098bfe7d40197a1b98d7ee085fc"
            },
            "id" : "b_id123",
            "key" : "b_id123"
        }
    ],
    "offset" : 0
}

现在,您可以遍历响应,查看哪些文档存在,哪些不存在。

此后,您可以批量添加不存在的文档:

请求:

POST /db/_bulk_docs HTTP/1.1
Accept: application/json
Content-Length: 109
Content-Type:application/json
Host: localhost:5984

{
    "docs": [
        {
            "_id": "c_id123",
            "foo": "bar",
        },
        {
            "_id": "d_id123",
            "foo": "bar c",
        },
        {
            "_id": "a_id123",
            "_rev": "1-a3544d296de19e6f5b932ea77d886942",
            "foo": "updated",
        }
    ]
}

批量获取文件: https://docs.couchdb.org/en/stable/api/database/bulk-api.html#post--db-_all_docs

用于批量创建/更新的文档: https://docs.couchdb.org/en/stable/api/database/bulk-api.html#db-bulk-docs

相关问题