我想为 GAE 的 Mapreduce 框架编写自定义 OutputWriter。这个 OutputWriter 应该打开一个直接的 tcp 连接到一个开放的 MongoDB 端口,并将 reduce 步骤的结果直接写入这个数据库。
我正在使用 pymongo 与 mongodb 交互。现有的 Mapreduce 库要求输出编写器是 JSON 可序列化的。一旦输出编写器与 mongodb 实例建立了连接,如下所示:
from pymongo import Connection
conn = Connection(host=MONGODB_HOST, port=MONGODB_PORT)
db = conn.test_db
db.authenticate(MONGODB_USERNAME, MONGODB_PASSWD)
我想序列化 Connection(pymongo.connection.Connection 类型)或 db 本身(pymongo .database.Database).自然地,这些对象不是 JSON 可序列化的,所以我想我可以制作一个带有 pickle 数据库的 JSON dict,但似乎 pymongo 本身不支持 pickle 这些对象,即既没有 __getstate__ 方法。
我假设我可以简单地存储连接和身份验证参数,并在反序列化 OutputWriter 时重新打开连接,但这似乎过于 hacky 和时间和资源密集型。
有人能给我指点一个解决方法,或者我没有想到的另一种序列化方法吗?
最佳答案
I assume I could simply store the connection and authentication parameters, and reopen a connection when the OutputWriter is deserialized, but that seems overly hacky and time and resource intensive.
您还希望能够做什么?一般来说,数据库连接是一些存在于 Python 之外的对象(套接字、文件句柄、由 C 库创建的不透明对象的实例等)的包装器,因此没有办法只存储一个并将其恢复到稍后的进程实例,将其传递给不同的进程等。因此,像这样的类的任何通用序列化都必须通过存储连接参数和重新连接来工作。
但在很多情况下您并不想这样做。 (此外,请记住,使某些内容可 pickle 也使其可复制,并且您总是希望通过打开一个新的不同但等效的连接来复制数据库连接这一点还很不清楚。)这就是为什么大多数数据库连接对象和类似的东西都是不可 pickle 。
与此同时,如果您试图在进程中传递这些,而连接仍然存在……那么您不应该首先对它们进行 pickle,只需传递对连接的引用即可。
所以无论如何,我建议你完全按照你的建议但不想做的那样做,但是通过子类化(或猴子修补)这两个类来包装它,这样它们就可以直接被 pickle ,而不是传递一堆将参数分开,让其他人都知道如何处理它。
我认为 __getstate__ 在这里不起作用。这意味着您可以通过默认构造实例然后设置属性或事后调用方法来建立数据库连接,但是大多数数据库连接类要求您将参数传递到构造函数调用中以在 __new__ 或 __init__ 时间。但是,您可能只使用 __getnewargs__(实际上比 __getstate__ 更简单)就可以做到这一点。如果没有,您将需要更复杂的 __reduce__ 机制。
关于python - pymongo - 序列化/pickle 连接或数据库对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667228/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类