From: Robert Klemme Date: 2007-05-31T22:45:12+09:00 Subject: Re: Does this code spawn lots of objects? On 31.05.2007 15:42, Ben Edwards wrote: > On 31/05/07, Robert Klemme wrote: >> On 31.05.2007 13:49, Ben Edwards wrote: >> > I have the following code:- >> > >> > dbh = DBI.connect('*', '*', '*') >> > smtp = Net::SMTP.start('*') >> > sql = open( "gw.sql", "r" ).read >> > sth = dbh.execute( sql ) >> > sth.fetch_hash do |row| >> > mail = MailFactory.new() >> > mail.to = "ben.edwards@ingenta.com" >> > mail.from = "ben.edwards@ingenta.com" >> > mail.subject = "file from ingenta" >> > mail.text = "Here is the file" >> > mail.attach( "./" + row["IDENTITYID"] + "_" + month + year + ".csv" ); >> > smtp.send_message( mail.to_s(), mail.from, mail.to ) >> > end >> > sth.finish >> > smtp.finish >> > dbh.disconnect >> > >> > This code seems to cause a new object to be created for every >> > iteration of the iterator. However is it true that 'mail = >> > MailFactory.new()' causes the previous Mailfactory object not to have >> > a reference to it and therefore it can be garbage collected? >> > >> > Is there a better way of coding the above? >> >> Probably not much room for improvement. One thing you can do for sure >> is to use the block form of those various connections / IO's you are >> using. And you can read in a complete file by doing File.read("ge.sql"). > > Sorry, forgot to ask. What do you mean by block form? DBI.connect('*', '*', '*') do |dbh| ... end You gain safety because it's guaranteed that the connection is closed regardless how the block is left (normal, exception). Kind regards robert