我需要从mongo(v3.2.10)集合(使用Pymongo 3.3.0)中获取大量(例如1亿)文档并迭代它们。迭代需要几天时间,我经常遇到由于游标超时而导致的异常。
在我的例子中,我需要在迭代时睡上不可预知的时间。例如,我可能需要:-获取10个文档-睡眠1秒-获取1000个文档-睡眠4小时-获取1个文档等
我知道我可以:
似乎一个好的解决方案是“触摸”光标使其保持活动状态。例如,我会将长时间的睡眠分解为较短的时间间隔,并在每个时间间隔之间触摸光标。
我没有看到通过皮蒙戈做到这一点的方法,但我想知道是否有人确切知道这是否可能。
对我来说,甚至没有no\u cursor\u timeout=True
起作用,所以我创建了一个函数,将光标中的数据保存到一个临时文件中,然后从文件中将文档返回给调用者。
from tempfile import NamedTemporaryFile
import pickle
import os
def safely_read_from_cursor(cursor):
# save data in a local file
with NamedTemporaryFile(suffix='.pickle', prefix='data_', delete=False) as data_file, cursor:
for count, doc in enumerate(cursor, 1):
pickle.dump(doc, data_file)
# open file again and iterate over data
with open(data_file.name, mode="rb") as data_file:
for _ in range(count):
yield pickle.load(data_file)
# remove temporary file
os.remove(data_file.name)
当然,这是不可能的,你想要的是功能SERVER-6036,这是未实现的。
对于这样一个长时间运行的任务,我建议对索引字段进行查询。例如,如果您的文档都有时间戳“ts”:
documents = list(collection.find().sort('ts').limit(1000))
for doc in documents:
# ... process doc ...
while True:
ids = set(doc['_id'] for doc in documents)
cursor = collection.find({'ts': {'$gte': documents[-1]['ts']}})
documents = list(cursor.limit(1000).sort('ts'))
if not documents:
break # All done.
for doc in documents:
# Avoid overlaps
if doc['_id'] not in ids:
# ... process doc ...
这段代码完全迭代光标,因此它不会超时,然后处理1000个文档,然后在接下来的1000个文档中重复。
第二个想法:使用很长的游标超时来配置服务器:
mongod --setParameter cursorTimeoutMillis=21600000 # 6 hrs
第三个想法:您可以更确定,尽管不是完全确定,您将通过在带有语句的中使用非超时游标来关闭它:
cursor = collection.find(..., no_cursor_timeout=True)
with cursor:
# PyMongo will try to kill cursor on server
# if you leave this block.
for doc in cursor:
# do stuff....
问题内容: 我正在开发一个android项目,当用户下载文件时该项目显示进度对话框。 但是,当用户触摸屏幕时,进度对话框将被关闭,而无需等待100%。我已经尝试使用此: 但这不起作用。 如何避免这种情况? 更新1: 似乎setCancelable(false)可以正常工作。非常感谢您的回答,但是当持久下载并用户决定放弃下载时,这将是不可能的,因为我已经停用了back keyCode: 我该如何解决
键盘/鼠标/触摸板 [HW] atkbd.set={2|3} 设置atkbd驱动(CONFIG_KEYBOARD_ATKBD)的键盘类型:2(默认值)表示AT键盘;3 表示PS/2键盘。 [HW] atkbd.reset 在初始化AT或PS/2键盘时重置键盘状态。常用于解决从休眠状态唤醒后键盘失效的故障。 [HW] atkbd.softraw={0|1} 当键盘按键被按下时,是返回原始的扫描码(S
在触摸条中为本机macOS应用程序创建一个label标签 进程: 主进程 new TouchBarLabel(options) 实验功能 用途:创建一个新的label标签 options Object label String (可选) - 要显示的文本 textColor String (可选) - 十六进制的文本颜色, 如#ABCDEF. 实例属性 TouchBarLabel有以下属性: t
我正在尝试使用填充洪水算法为应用程序制作立方体绘制工具。 这是算法的代码: } 这是我在ImageView上处理触摸事件的部分: 问题是坐标不准确。我的意思是,无论我在哪里触摸图像,它都会被画在我没有画的其他部分。 在将事件坐标发送到填充算法之前,是否需要处理它们?我也尝试过全屏图像,这种情况一直在发生。
在我的代码中,我有: 一个扩展JComponent的抽象类,其中包含一些JTextFields。JTextFields是不可编辑的。JComponent类实现了MouseListener:-当mouseEnted事件触发时,将向其添加一个边框。-当mouseExted事件触发时,边框被删除。-当mouseClick事件触发时,该组件的所有字段都设置为可编辑。 这应该是这样的: 用户想要编辑一个字段
启用触摸保护 把 Yubikey-manager 安装在一个绝对路径:【译者注:homebrew 是 macOS 平台的包管理软件】 ❯ brew install libu2f-host libusb swig ykpers ❯ git clone git@github.com:Yubico/Yubikey-manager.git ❯ git submodule update --init --r