Does this code spawn lots of objects?

B

Ben Edwards

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 = "(e-mail address removed)"
mail.from = "(e-mail address removed)"
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?

Ben
 
R

Robert Klemme

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 = "(e-mail address removed)"
mail.from = "(e-mail address removed)"
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").

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
 
B

Ben Edwards

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 = "(e-mail address removed)"
mail.from = "(e-mail address removed)"
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").

What difference will this make?

Thanks for advice,
Ben
 
B

Ben Edwards

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 = "(e-mail address removed)"
mail.from = "(e-mail address removed)"
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?
 
R

Robert Klemme

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 = "(e-mail address removed)"
mail.from = "(e-mail address removed)"
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,608
Members
45,249
Latest member
KattieCort

Latest Threads

Top