From: Ben Edwards Date: 2007-05-31T22:42:24+09:00 Subject: Re: Does this code spawn lots of objects? 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? > Probably you can also reuse the MailFactory (from, to, subject and text > don't change anyway). But I have no idea whether that will create any > improvement. And I also do not know that class so take this advice with > a grain of salt. > > Another idea is to start a second thread for mail sending. Connect both > threads with a queue with limited size. That way you may use IO > resources more efficiently. > > Kind regards > > robert > > -- Ben Edwards - Bristol, UK If you have a problem emailing me use http://www.gurtlush.org.uk/profiles.php?uid=4 (email address this email is sent from may be defunct)