0

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

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

到目前为止有效的方法:

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

面临的问题:

  • 在一个循环中,试图为每个 JSON 对象检查 cloudant 中的现有记录,它只是不会超出少数记录并最终出现与内存/堆相关的错误,而且它还存在 cloudant 速率限制问题,随着查找速度很快就会饱和并且导入操作发生在循环内。

确切的错误:

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

笔记:

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

有人可以建议最好的方法来解决这个要求而不会遇到我上面提到的问题吗?任何解决此要求的替代 npm 包也是最受欢迎的。任何改变我的开发方法的建议也很受欢迎。

4

1 回答 1

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

于 2020-04-23T03:58:33.050 回答