此问题已发布在 AWS 论坛上,但仍未得到解答 https://forums.aws.amazon.com/thread.jspa?threadID=94589
我正在尝试执行一长串简短项目(大约 1.2 亿个)的初始上传,稍后通过唯一 key 检索它们,这似乎是 DynamoDb 的完美案例。
但是,我目前的写入速度非常慢(每 100 次写入大约需要 8-9 秒),这使得初始上传几乎不可能(以目前的速度大约需要 3 个月)。
我已阅读 AWS 论坛寻找答案并已尝试过以下操作:
我从单个“put_item”调用切换到批量写入 25 个项目(建议的最大批量写入大小),并且我的每个项目都小于 1Kb(这也是推荐的)。即使我的 25 个项目也小于 1Kb 也是非常典型的,但这并不能保证(并且应该无关紧要,因为据我所知,只有单个项目大小对 DynamoDB 很重要)。
我使用最近引入的欧盟区域(我在英国)通过调用 set_region('dynamodb.eu-west-1.amazonaws.com') 直接指定其入口点,因为显然没有其他在 PHP API 中执行此操作的方法。 AWS 控制台显示该表位于适当的区域,因此可以正常工作。
我已通过调用 disable_ssl() 禁用了 SSL(每 100 条记录增加 1 秒)。
不过,包含 100 个项目的测试集(对 25 个项目进行 4 次批量写入调用)索引所需的时间绝不会少于 8 秒。每个批量写入请求大约需要 2 秒,因此不会像第一个请求是即时的并且随后的请求很慢。
我的表配置的吞吐量是 100 个写入单元和 100 个读取单元,到目前为止应该足够了(为了以防万一,尝试了更高的限制,但没有效果)。
我也知道请求序列化有一些开销,所以我可以使用队列来“累积”我的请求,但这对 batch_writes 真的那么重要吗?我不认为这是问题所在,因为即使是单个请求也需要很长时间。
我发现有些人修改 API 中的 cURL header (特别是“Expect:”)以加快请求速度,但我认为这不是正确的方法,而且 API 也已根据该建议进行了更新已发布。
运行我的应用程序的服务器也很好 - 我读到有时 CPU 负载会达到顶峰,但在我的情况下一切都很好,只是网络请求花费的时间太长。
我现在被困住了——还有什么我可以尝试的吗?如果我没有提供足够的信息,请随时询问更多信息。
最近还有其他线程,显然是在同一个问题上,here (虽然到目前为止还没有答案)。
这项服务应该是超快的,所以我一开始就对这个问题感到很困惑。
最佳答案
如果您从本地计算机上传,速度将受到您与服务器之间的各种流量/防火墙等的影响。如果我调用 DynamoDB,每个请求只需要 0.3 秒,这仅仅是因为往返澳大利亚的时间。
我的建议是使用 PHP 为自己创建一个 EC2 实例(服务器),将脚本和所有文件作为一个 block 上传到 EC2 服务器,然后从那里进行转储。 EC2 服务器对 DynamoDB 服务器来说应该有极快的速度。
如果您对自己使用 LAMP 设置 EC2 没有信心,那么他们有一项新服务“Elastic Beanstalk”可以为您完成这一切。完成上传后,只需刻录服务器 - 希望您可以在他们的“免费套餐”定价结构内完成所有这些工作:)
不能解决长期的连接问题,但会减少三个月的上传时间!
关于php - 写入 Amazon DynamoDB (PHP API) 的速度慢得离谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10682797/
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我正在编写一个ruby程序,它应该执行另一个程序,通过stdin向它传递值,从它的stdout读取响应,然后打印响应。这是我目前所拥有的。#!/usr/bin/envrubyrequire'open3'stdin,stdout,stderr=Open3.popen3('./MyProgram')stdin.puts"helloworld!"output=stdout.readerrors=stderr.readstdin.closestdout.closestderr.closeputs"Output:"puts"-------"putsoutputputs"\nErrors:"p
我正在处理http://prepwork.appacademy.io/mini-curriculum/array/中概述的数组问题我正在尝试创建函数my_transpose,它接受一个矩阵并返回其转置。我对写入二维数组感到很困惑!这是一个代码片段,突出了我的困惑。rows=[[0,1,2],[3,4,5],[6,7,8]]columns=Array.new(3,Array.new(3))putscolumns.to_s#Outputisa3x3arrayfilledwithnilcolumns[0][0]=0putscolumns.to_s#Outputis[[0,nil,nil],[
我在一个ruby文件中有一个函数可以像这样写入一个文件File.open("myfile",'a'){|f|f.puts("#{sometext}")}这个函数在不同的线程中被调用,使得像上面这样的文件写入不是线程安全的。有谁知道如何以最简单的方式使这个文件写入线程安全?更多信息:如果重要的话,我正在使用rspec框架。 最佳答案 您可以通过File#flock给锁File.open("myfile",'a'){|f|f.flock(File::LOCK_EX)f.puts("#{sometext}")}
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
有人可以花我一些代码,在图像底部添加文本吗?我想使用Rmagick,但我也愿意使用其他工具。 最佳答案 我也发现了这个,它非常适合我。require'RMagick'includeMagick#Dimisionsbasedonanimage3072x2048unlessARGV[0]andFile.exists?(ARGV[0])puts"\n\n\nYouneedtospecifyafilename:watermark.rb\n\n\n"exitendimg=Image.read(ARGV[0]).firstnew_img="wm
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。在我在网上找到的每个基准测试中,Ruby似乎都很慢,比Java慢得多。Ruby的人只是说这无关紧要。您能举个例子说明RubyonRails(以及Ruby本身)的速度真的无关紧要吗?
我目前正在试验ActionController::Live,但我不知道如何正确地测试它。在我的Controller中,我写了这个response.stream.write("event:#{event}\n")response.stream.write("data:#{post.to_json}\n\n")但是当我在rspec测试中检查对象时,我看到了这个(rdb:1)response.stream.instance_variable_get(:@buf)["event:event\n"]当我将“数据”写入流时,我不明白为什么它没有出现在数组中。当我删除第一个response.stre
我想使用rmagick将图像写入文件。下面给出的是我的代码im="base64encodedstring"image=Magick::Image.from_blob(Base64.decode64(im)image[0].format="jpeg"name="something_temp"path="/somepath/"+nameFile.open(path,"wb"){|f|f.write(image[0])}我也尝试过使用f.write(image).但是文件中写入的是#.这是什么原因? 最佳答案 这应该有效:image[0]