|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Hello,
I've got an array that holds urls. Example Element: http://bla.random.com/bla.jpg. I also have images in a directory. I'd like my script to compare the bla.jpg from the URL with all files in a directory to make sure it's not a duplicate of something that's already there - if it is - delete it from the array. My current way of doing it uses quite a bit of resources, was wondering if someone could show me a more efficient example if possible. Current Code: Dir["#{$baseDir}/#{board}/#{$dateString}/**"].each do |file| $imgArray.delete_if{ |i| i =~ /#{file.split('/').pop}/ } -- Posted via http://www.ruby-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On Thu, Feb 21, 2008 at 11:24 PM, Kyle Hunter <keletmaster@gmail.com> wrote:
> Hello, > > I've got an array that holds urls. Example Element: > http://bla.random.com/bla.jpg. > > I also have images in a directory. I'd like my script to compare the > bla.jpg from the URL with all files in a directory to make sure it's not > a duplicate of something that's already there - if it is - delete it > from the array. My current way of doing it uses quite a bit of > resources, was wondering if someone could show me a more efficient > example if possible. > > Current Code: > Dir["#{$baseDir}/#{board}/#{$dateString}/**"].each do |file| > $imgArray.delete_if{ > |i| i =~ /#{file.split('/').pop}/ > } 1. use file.split('/').last instead of pop - pop modifies the array 2. move the regex out of the block - you'll save some object constructions/destructions, and it'll be easier on GC too. 3. try instead of splitting using a regex or rindex. i.e. last_part = $1 if file =~ /\/([^/]*)$/ or last_part = file[file.rindex('/')..-1] or file[(file.rindex('/')||0)..-1] to fix the cae when there's no '/' in the filename. 4. use Benchmark class to measure your improvements - that way, you'll know exactly if the new code is better or not. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Kyle Hunter wrote:
> Hello, > > I've got an array that holds urls. Example Element: > http://bla.random.com/bla.jpg. > > I also have images in a directory. I'd like my script to compare the > bla.jpg from the URL with all files in a directory to make sure it's not > a duplicate of something that's already there - if it is - delete it > from the array. My current way of doing it uses quite a bit of > resources, was wondering if someone could show me a more efficient > example if possible. > > Current Code: > Dir["#{$baseDir}/#{board}/#{$dateString}/**"].each do |file| > $imgArray.delete_if{ > |i| i =~ /#{file.split('/').pop}/ > } > Try: require 'set' files = Dir["#{$baseDir}/#{board}/#{$dateString}/**"].map { |file| File.basename(file) }.to_set $imgArray.delete_if {|i| files.include? i.split("/")[-1] } -Justin |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Thanks both of you,
Justin's example seems to have made it more efficient. Later on I'll compare my original, a version with Jano's suggestions, and Justin's using benchmark to see what is the most efficient. Any more suggestions are welcome, of course, the more to benchmark the merrier! -- Posted via http://www.ruby-forum.com/. |
|
![]() |
| Outils de la discussion | |
|
|