gpt4 book ai didi

python - 使用多线程将 AWS Lambda 批量写入 DynamoDB 的执行速度较慢

转载 作者:行者123 更新时间:2023-11-28 18:34:47 28 4
gpt4 key购买 nike

免责声明:我知道这个问题会惹恼一些人,因为它含糊不清、理论上而且代码很少。

我在 Python 中有一个 AWS Lambda 函数,它从 S3 读取非规范化记录文件,正确格式化其内容,然后通过批量写入将其上传到 DynamoDB。一切都像宣传的那样有效。然后我尝试将此管道的上传部分分解为线程,希望更有效地利用 DynamoDB 的写入能力。但是,多线程版本要慢大约 50%。由于代码很长,我包含了伪代码。

NUM_THREADS = 4
for every line in the file:
Add line to list of lines
if we've read enough lines for a single thread:
Create thread that uploads list of lines
thread.start()
clear list of lines.

for every thread started:
thread.join()

到目前为止我检查过的重要注意事项和可能的问题来源:

  • 在使用 DynamoDB Local 进行本地测试时,线程确实让我的程序运行得更快。
  • 如果相反我只使用 1 个线程,或者即使我使用多个线程但我在启动线程后立即加入线程(实际上是单线程),程序完成得更快。 1线程~30s,多线程~45s。
  • 我在线程之间没有共享内存,没有锁等。
  • 我曾尝试为每个线程创建新的 DynamoDB 连接并改为共享一个连接,但没有任何效果。
  • 我已经确认添加更多线程不会超过 DynamoDB 的写入容量,因为它发出相同数量的批写入请求,而且在整个执行过程中我没有比使用单个线程更多的未处理项目。
  • 线程应该改进执行时间,因为程序是网络绑定(bind)的,即使 Python 线程实际上并不在多核上运行。
  • 我试过先读取整个文件,然后生成所有线程,认为最好不要中断磁盘 IO,但没有效果。
  • 我已经尝试了 Thread 库和 Process 库。

同样,我知道这个问题非常理论化,所以可能很难看出问题的根源,但是否有一些我不知道的 Lambda 怪癖?还有什么我可以尝试帮助诊断问题的吗?感谢您的帮助。

最佳答案

Nate,你是否完全排除了 Dynamodb 端的问题?写入请求的总数可能相同,但每秒的数量在多线程中会有所不同。

控制台有一些有用的图表可以显示您的写入(或批量写入)是否受到限制。如果您的 Lambda 函数中没有正确的“后退、重试”逻辑,Lambda 只会不断尝试,而您的问题会变得更糟。

另一件事,这对您来说可能是显而易见的(但我不是!)。我的印象是 batch_writes 在容量规划方面为您节省了资金。 (例如,以 20 为一组的 200 次写入只会花费 10 个写入单位。我发誓我曾听到 AWS 人员在演示中提到过这一点,但那不是重点。)

事实上,batch_writes 为您节省了一些时间,但并不经济。

最后一个想法:我敢打赌,Lambda 处理时间比增加 Dynamodb 写入容量要便宜。如果您并不急于让 Lambda 完成,为什么不让它在单线程上运行呢?

祝你好运!

关于python - 使用多线程将 AWS Lambda 批量写入 DynamoDB 的执行速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33546972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com