【问题标题】:Ruby: Cloud Spanner insert performanceRuby:Cloud Spanner 插入性能
【发布时间】:2017-09-01 21:35:42
【问题描述】:

我发现了用于 Ruby 的 google-cloud-spanner gem。

使用session.commit { |c| c.insert(table, row) },我可以轻松插入 Cloud Spanner。

但是,通过这种方式(来自同一区域的计算实例),我每秒不能超过 ~200 次插入。 为了提高性能,我必须将一个行数组传递给插入方法:c.insert(table, [row, row, row,...])

为什么 Cloud Spanner 会以这种方式工作?这可能是由于网络开销造成的吗?

在我的应用程序层上将多条记录一起插入并不总是可行的。

编辑:

显示创建 spanner 客户端等的完整示例:

spanner = Google::Cloud::Spanner.new(project: ..., keyfile: ...)
session = spanner.client(instance, database)

# Insert:
session.commit { |c| c.insert(table, row) }

【问题讨论】:

  • 您能否使用更多代码更新您的问题,以显示您正在做什么以每分钟仅获得约 200 次插入?什么类型的对象是会话?我们通常会看到更高的性能。
  • 您是否为每个插入创建一个新的扳手客户端对象?或者您是否在一分钟内对所有 200 次插入使用相同的扳手客户端对象?
  • 嗨,首先每分钟 ~200 次插入是一个错字,我的意思是每秒 ~200 次插入。不过,我认为它有点慢。当我将一个行数组传递给插入方法时,我每秒可以实现数千条记录。我更新了我的帖子,展示了我如何创建扳手并连接到数据库。我没有为每个插入创建一个新的扳手客户端,但我为每个插入做一个session.commit { ... }
  • 每秒 200 笔交易绝对比一分钟 200 笔要好! :) 您是否尝试过调整最大会话池大小以查看这是否有助于提高吞吐量? googlecloudplatform.github.io/google-cloud-ruby/#/docs/…你在用线程吗?

标签: ruby google-cloud-platform google-cloud-spanner


【解决方案1】:

您遇到的性能问题不是由 ruby​​ 本身引起的,它只是扳手的工作原理,

您每次提交都提交每一行,这需要很长时间 尝试将其作为每 500 行的一个包来执行,它会显着加快速度

并注意突变,一般情况下您的程序需要计算它 库会抛出一个你达到上限的异常

我最近测试了像你一样将 100mb/(110k 行) csv 文件加载到 spanner 中,它需要 1 小时 30 分钟

当我重写我的代码以每 500 行提交一次时,它在 3 分钟内结束加载。

(阅读有关突变的信息,在我的情况下 500 行是可以的,在你的情况下可以不同)

这个公式似乎是合法的:https://github.com/googleapis/google-cloud-go/issues/1721#issuecomment-572273387

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2017-07-09
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多