我正在将大量数据索引到 DynamoDB 中,并尝试批量写入以增加实际吞吐量(即加快索引速度)。这是一段代码(这是原始来源):
def do_batch_write(items,conn,table):
batch_list = conn.new_batch_write_list()
batch_list.add_batch(table, puts=items)
while True:
response = conn.batch_write_item(batch_list)
unprocessed = response.get('UnprocessedItems', None)
if not unprocessed:
break
# identify unprocessed items and retry batch writing
Run Code Online (Sandbox Code Playgroud)
我正在使用 boto 版本 2.8.0。如果items
元素超过 25 个,则会出现异常。有没有办法增加这个限制?此外,我注意到有时,即使items
较短,也无法一次尝试处理所有这些。但是这种情况发生的频率或尝试后有多少元素未处理,与 的原始长度之间似乎没有相关性items
。有没有办法避免这种情况并一次性写出所有内容?现在,最终目标是加快处理速度,而不仅仅是避免重复,因此在连续尝试之间长时间休眠不是一种选择。
谢谢
我的代码中有以下几行
outs = codecs.getwriter('utf-8')(sys.stdout)
# dJSON contains JSON message with non-ASCII chars
outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val))
Run Code Online (Sandbox Code Playgroud)
我收到以下异常:
outs.write(json.dumps(dJSON,encoding='utf-8', ensure_ascii=False, indent=indent_val))
File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 204, in encode
return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 27: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我通过encoding='utf-8'
在json.dumps
声明中指定,我避免了这种类型的问题.为什么我仍然收到错误?
我一直在安装了API版本15的设备上测试Android应用.我现在必须切换到具有版本14的其他设备(三星Galaxy Nexus,如果它很重要).尽管我从Google API 15到14更改了"项目构建目标",但当我尝试时仍然会收到以下消息在新设备上执行应用程序:
错误:应用程序需要API版本15.设备API版本为14(Android 4.0.2).
清理所有项目没有帮助.重启Eclipse没有帮助.我创建了一个目标= 14的简单的新测试应用程序,它工作正常.
为什么旧项目的更改没有生效?
谢谢!
我正在尝试使用 PyDrive 以编程方式列出并下载存储在我可以在浏览器中访问的团队驱动器上的文件。当我这样做时:
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
drive = GoogleDrive(gauth)
file_list = drive.ListFile(
{
'q': "'root' in parents and trashed=false",
'corpora': "teamDrive",
'teamDriveId': <team drive ID>,
'includeTeamDriveItems': "true",
'supportsTeamDrives': "true"
}
).GetList()
for file1 in file_list:
print('title: %s, id: %s' % (file1['title'], file1['id']))
Run Code Online (Sandbox Code Playgroud)
我只得到我个人驱动器上的文件列表,而不是团队驱动器。我究竟做错了什么?
注意1:我<team drive ID>
通过在浏览器中打开团队驱动器(根文件夹)并复制“ https://drive.google.com/drive/folders/ ”之后的所有内容来获得
注2:浏览器弹出drive.ListFile
并给出Authentication successful.
我有以下Python代码块:
data = json.loads(line)
if data.has_key('derivedFrom'):
dFin = data['derivedFrom']
if dFin.has_key('derivedIds'):
Run Code Online (Sandbox Code Playgroud)
这曾经在JSON块上正常工作,如下所示:
"derivedFrom": {"source": "FOO", "model": "BAR", "derivedIds": ["123456"]}
Run Code Online (Sandbox Code Playgroud)
现在格式改为:
"derivedFrom": "{\"source\": \"FOO.\", \"model\": \"BAR\", \"derivedIds\": [\"123456\"]
Run Code Online (Sandbox Code Playgroud)
因此,Python块中的最后一行会引发以下异常:
'unicode' object has no attribute 'has_key'
Run Code Online (Sandbox Code Playgroud)
有没有办法预处理JSON has_key
再次工作?
我手头有一个相当简单的任务:给定一个(小写的)big
字符串和一个(小写的)字符串数组,small
如果所有small
字符串都在字符串中,我需要产生1 big
,否则为0.所以这样做的pythonic方法就是:
>>> big = 'the quick brown fox jumps over the lazy dog'
>>> smallTrue = ["quick","dog","fox"]
>>> smallFalse = ["quick","fox","wolf"]
>>> int(all([s in big for s in smallTrue]))
1
>>> int(all([s in big for s in smallFalse]))
0
Run Code Online (Sandbox Code Playgroud)
问题在于是否有一种不同的方法可以使得0和1更好地扩展到更长的big
s(显然更长)(想想"典型"科学论文的摘要)加上大量small
更长的数组?
缩放意味着处理时间,因为我的机器有很多RAM.因此,如果我需要以某种方式预处理数据,这将需要更多的RAM,这将是好的.
问的原因是因为我遇到了一些类似字符串操作任务的可伸缩性问题.
我有一个元组列表列表.每个元组都有这种形式(string,int)
,例如
lst = list()
lst.append([('a',5),('c',10),('d',3),('b',1)])
lst.append([('c',14),('f',4),('b',1)])
lst.append([('d',22),('f',2)])
Run Code Online (Sandbox Code Playgroud)
将其int
视为不同文本块中每个字符串的计数.
我需要做的是产生一个最常N
出现的字符串列表及其累积计数.所以在上面的例子中,a
出现5次,b
出现两次,c
出现24次等等.如果N=2
,那么我将不得不生成一对并行列表['d','c']
和/ [25,24]
或元组列表[('d',25),('c',24)]
.我需要尽快完成.我的机器有很多RAM,所以内存不是问题.
我有这个实现:
import numpy as np
def getTopN(lst,N):
sOut = []
cOut = []
for l in lst:
for tpl in l:
s = tpl[0]
c = tpl[1]
try:
i = sOut.index(s)
cOut[i] += c
except:
sOut.append(s)
cOut.append(c)
sIndAsc = np.argsort(cOut).tolist()
sIndDes = sIndAsc[::-1]
cOutDes = [cOut[sir] for sir in sIndDes]
sOutDes …
Run Code Online (Sandbox Code Playgroud)