我最近开始通过shell和PyMongo测试MongoDB.我注意到返回游标并尝试迭代它似乎是实际迭代中的瓶颈.有没有办法在迭代期间返回多个文档?
伪代码:
for line in file:
value = line[a:b]
cursor = collection.find({"field": value})
for entry in cursor:
(deal with single entry each time)
Run Code Online (Sandbox Code Playgroud)
我希望做的是这样的:
for line in file
value = line[a:b]
cursor = collection.find({"field": value})
for all_entries in cursor:
(deal with all entries at once rather than iterate each time)
Run Code Online (Sandbox Code Playgroud)
我已经尝试按照这个问题使用batch_size()并将值一直更改为1000000,但它似乎没有任何影响(或者我做错了).
任何帮助是极大的赞赏.这个Mongo新手请轻松一点!
---编辑---
谢谢迦勒.我想你已经指出了我真正想要问的问题,这就是:有什么方法可以进行排序collection.findAll()或cursor.fetchAll()命令,就像cx_Oracle模块一样?问题不在于存储数据,而是尽可能快地从Mongo DB中检索数据.
据我所知,数据返回给我的速度由我的网络决定,因为Mongo必须单次获取每条记录,对吗?
我有两段代码,它们都是为了做同样的事情 - 坐在一个循环中,直到写完文件.它们主要用于通过FTP/SCP进入的文件.
一个版本的代码使用它os.stat()[stat.ST_SIZE]:
size1,size2 = 1,0
while size1 != size2:
size1 = os.stat(file_name)[stat.ST_SIZE]
time.sleep(300)
size2 = os.stat(file_name)[stat.ST_SIZE]
Run Code Online (Sandbox Code Playgroud)
另一个版本用于os.path.getsize():
size1,size2 = 0,0
while True:
size2 = os.path.getsize(file_name)
if size1 == size2:
break
else:
time.sleep(300)
size1 = size2
Run Code Online (Sandbox Code Playgroud)
我已经看到多个实例,其中使用第一种方法报告,当文件实际上仍在增长时,大小相同.是否有一些潜在的原因导致os.stat()错误报告而os.path.getsize()不会?我没有看到任何错误或异常.
出于专业的好奇心,比较C中两个完全数字字符串的最安全/最快/最有效的方法是什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char str1[5] = "123";
char str2[5] = "123";
char *ptr;
if(atoi(str1) == atoi(str2))
printf("Equal strings");
if(strtol(str1,&ptr,10) == strtol(str2,&ptr,10))
printf("Equal strings");
if(strcmp(str1,str2)==0)
printf("Equal strings");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我知道有些人不喜欢它,但我喜欢使用Python的三元运算符,因为它使得简单if/ else语句更清晰(我认为).无论如何,我发现我不能这样做:
>>> a,b = 1,2 if True else 0,0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
我认为三元运算符的工作方式是它实质上构建了以下内容:
if True:
a,b = 1,2
else:
a,b = 0,0
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我的第一个代码示例不起作用?并且,如果有一个,提供一个单行有条件地分配多个变量?
我只是有一个过去的想法,并想到了更好的地方,然后就在这里.出于好奇,有没有人知道是否打开文件追加,如下所示:
file_name = "abc"
file_handle = open(file_name,"a")
Run Code Online (Sandbox Code Playgroud)
基本上与打开文件进行编写和寻求结束相同:
file_name = "abc"
file_handle = open(file_name,"w")
file_handle.seek(0,2) # 0 for offset, 2 for end-of-file
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否打开一个文件for append实际上是在做第二个块,打开写入,然后搜索到文件的末尾,在幕后.
我有一个可以与Oracle或MySQL连接的类.该类初始化为关键字"Oracle"或"MySQL"以及一些其他参数,这些参数是两种数据库类型的标准(要打印的内容,是否停止异常等).
if Oracle do A, elif MySQL do B当我开始时,根据需要添加它很容易,但是当我添加仅适用于一种数据库类型的更专业的代码时,这变得很难看.我把这个类分成两个,一个用于Oracle,一个用于MySQL,有一些共享函数以避免重复代码.
处理调用这些新类的最Pythonic方法是什么?我是否创建了一个使用相同关键字并返回正确类的包装函数/类?我是否更改了调用旧泛型类的所有代码以调用正确的特定于DB的类?
如果需要,我很乐意模拟一些示例代码,但我认为没有必要.在此先感谢您的帮助!
我正在使用botoPython中的库连接到DynamoDB.以下代码对我来说很好:
import boto
key = 'abc'
secret = '123'
con = boto.connect_dynamodb(key,secret)
table = con.get_table('Table Name')
-- rest of code --
Run Code Online (Sandbox Code Playgroud)
当我尝试连接到特定区域时,我可以很好地连接,但让表格正常工作会引发错误:
import boto
from boto.ec2.connection import EC2Connection
key = 'abc'
secret = '123'
regions = EC2Connection(key,secret).get_all_regions() # some filtering after this line to remove unwanted entries
for r in regions:
con = boto.connect_dynamodb(key,secret,region=r)
table = con.get_table('Table Name') # throws the error below
-- rest of code --
Run Code Online (Sandbox Code Playgroud)
使用上面的第二个代码块,我得到一个ValueError: No JSON object could be decoded.调用con.list_tables() …
我有一个动态的Python服务,它将在每个记录的基础上定义函数,我遇到了一些我无法弄清楚的东西.假设我有一个如此设置的测试程序:
func_str = """
def func():
print "top"
"""
exec func_str
func_str = """
def func():
print "bottom"
"""
exec func_str
func()
Run Code Online (Sandbox Code Playgroud)
当然,这将打印"bottom",作为第二次exec func_str覆盖第一次调用.我好奇发生了什么事.是否以某种方式删除了第一个函数定义?