我正在编写代码,从数据库表中提取数据并将它们写入 XML 文件(由另一个进程获取)。大约有60,000条记录,每条记录可以有多个实体,即一个成员可以有多个联系人,每个联系人可以有几个电话号码等。整个过程需要几个小时,我已经将慢速缩小到实际拉取数据(不编写 XML,或拉取后的任何数据处理等)。我以两种不同的方式尝试了代码,结果相似。首先,我利用 LINQ 查询并在一个语句中创建所有元素:
Dim output =
From m In dc.members
Select New XElement("member", _
New XElement("id", m.member_id), _
New XElement("address", m.Address), _
New XElement("city", m.City), _
New XElement("state", m.State), _
New XElement("contacts", _
From c in m.contacts
Select New XElement("contact", _
New XElement("contact_name", c.name), _
New XElemdnt("contact_address", c.address), _
...
我认为可能是所有 XElements 的创建导致它变慢了,所以我尝试使用 For 循环将元素直接写入 XML 文件:
Dim output As New Xml.XmlTextWriter("my.xml", Nothing)
For Each m in dc.members
output.WriteStartElement("member")
output.WriteElementString("id", m.member_id)
output.WriteElementString("address", m.Address)
output.WriteElementString("city", m.City)
output.WriteElementString("state", m.State)
output.WriteStartElement("contacts")
For Each c in m.contacts
output.WriteStartElement("contact")
output.WriteElementString("contract_name", m.name)
output.WriteElementString("contract_address", m.address)
....
该过程花费的时间几乎没有变化。然后,我尝试剥离所有元素并将代码缩减为仅提取数据库,但同样速度很慢。
是否有更快/更好的方法从数据库中提取所有这些规范化数据,以便我可以尽快将其获取到 XML 文件?
最佳答案
内部循环的每次传递都会访问数据库。使用 LINQ 表达式一次获取所需的数据。在 C# 中(抱歉,我不知道 VB.Net)它看起来像:
var members = from m in dc.members
select new {
m.member_id,
m.Address,
...
contacts = from c in m.contacts
select new {
c.name,
c.address
}
};
var output = from m in members
select new XElement...
作为旁注,您可以在 VB.Net 中使用 XML 语法...
Dim output = _
From m In members _
Select <member>
<id><%= m.member_id %></id>
<address><%= m.Address %></address>
...
<contacts>
<%= From c in m.contacts _
Select <contact>
<contact_name><%= c.name %></contact_name>
<contact_address><%= c.address %></contact_address>
...
</contact>
%>
</contacts>
</member>
关于.net - 循环遍历 LINQ 数据的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3997182/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer