尝试找到更好的方法,使用Ruby脚本通过多个目录操作大型多个txt文件

尝试找到更好的方法,使用Ruby脚本通过多个目录操作大型多个txt文件,ruby,file,directory,large-files,Ruby,File,Directory,Large Files,我正在从制造环境中的产品收集测试测量数据。 被测单元的测试测量结果由测试系统生成。它是一个2Mb txt文件,保存在由产品分隔的共享文件夹中 文件夹结构看起来像 LOGS |-Product1 | |-log_p1_1.txt | |-log_p1_2.txt | |.. |-Product2 | |-log_p2_1.txt | |-log_p2_2.txt | |.. |-... 我的ruby脚本可以遍历LOGS下的每个产品目录,然后读取每个log\u px\u n.txt文件

我正在从制造环境中的产品收集测试测量数据。 被测单元的测试测量结果由测试系统生成。它是一个2Mb txt文件,保存在由产品分隔的共享文件夹中

文件夹结构看起来像

LOGS
|-Product1
|  |-log_p1_1.txt
|  |-log_p1_2.txt
|  |..
|-Product2
|  |-log_p2_1.txt
|  |-log_p2_2.txt
|  |..
|-...
我的ruby脚本可以遍历LOGS下的每个产品目录,然后读取每个
log\u px\u n.txt
文件,解析文件中需要的数据并将其更新到数据库中

问题是,的所有log_px_n.txt文件必须保留在其当前目录中,包括旧文件和新文件,而我需要在生成新的
log_px_n.tx
文件后立即更新数据库

我今天所做的是尝试遍历每个产品目录,然后读取每个单独的
.txt
文件,并在更新文件之后将其放入数据库(如果不存在)

我的脚本看起来像

Dir['*'].each do |product|
  product_dir = File.join(BASE_DIR, product)
  Dir.chdir(product_dir)
     Dir['*.txt'].each do |log|
       if (Time.now - File.mtime(log) < SIX_HOURS_AGO)   # take only new files in last six hours
       # Here we do..
       # - read each 2Mb .txt file
       # - extract infomation from txt file
       # - update into database
     end
   end
end
结果表明

at产品ABU43E
..
..
..
at产品AXF40J
at产品ACZ16C
2014-04-21 17:32:07 +0700
at产品ABZ14C
at产品AXF90E
at产品ABZ14B
at产品ABK43E
at产品ABK01A
2014-04-21 17:32:24 +0700
2014-04-21 17:32:24 +0700
at产品ABU05G
at产品ABZABF
2014-04-21 17:32:28 +0700
2014-04-21 17:32:28 +0700
2014-04-21 17:32:28 +0700
2014-04-21 17:32:28 +0700
2014-04-21 17:32:28 +0700
2014-04-21 17:32:28 +0700
%累积自我总数
时间秒秒呼叫ms/呼叫ms/呼叫名称
32.54 1.99 1.99 43 46.40 265.60阵列#每个
24.17 3.48 1.48 41075 0.04 0.04文件#mtime
13.72 4.32 0.84 43 19.AX 19.AX Dir#glob
9.13 4.88 0.AX 41075 0.01 0.03时间#-
8.14 5.38 0.50 41075 0.01 0.01浮动
6.65 5.79 0.41 41075 0.01 0.01时间#现在
2.06 5.91 0.13 41084 0.00 0.00时间#初始化
1.79 6.02 0.11 41075 0.00 0.00浮动#<
1.79 6.13 0.11 41075 0.00 0.00浮动#/
0.00 6.13 0.00 1 0.00 0.00阵列#连接
0.00 6.13 0.00 51 0.00 0.00 Kernel.put
0.00 6.13 0.00 51 0.00 0.00 IO#puts
0.00 6.13 0.00 102 0.00 0.00 IO#写入
0.00 6.13 0.00 42 0.00 0.00文件#加入
0.00 6.13 0.00 43 0.00 0.00 Dir#chdir
0.00 6.13 0.00 10 0.00 0.00等级#新
0.00 6.13 0.00 1 0.00 0.00 MyCollector#初始化
0.00 6.13 0.00 9 0.00 0.00整数#四舍五入
0.00 6.13 0.00 9 0.00 0.00美国时间
0.00 6.13 0.00 1 0.00 6131.00 MyCollector#collect
0.00 6.13 0.00 1 0.00 6131.00#顶级
[以477.5s完成]

事实证明,浏览每个目录中的每个文件需要7分钟。然后打电话给mtime。 虽然我的.txt文件是2Mb,但它不应该花费那么长的时间,不是吗


任何建议,请?

依靠
mtime
是不可靠的。事实上,Rails在命名资产文件版本时从使用mtime切换到使用哈希

您应该保留一个文件哈希对列表。可以这样获得:

require "digest"

file_hash_pair =
Dir.glob("LOGS/**/*")
.select{|f| File.file?(f)}
.map{|f| [f, Digest::SHA1.hexdigest(File.read(f))]}

也许您可以将其内容作为YAML保存在一个文件中。每次都可以运行上面的代码,只要
file\u hash\u pair
与前面的值不同,就可以判断出有更改。如果
file\u hash\u pair.transpose[0]
已更改,则可以判断是否存在文件操纵。如果对于特定的
[文件,散列]
对,
散列
已更改,则可以判断文件
文件
已更改。

代码看起来正常。我建议对处理代码进行注释,并添加带有时间戳的分析输出,以实际找出速度慢的地方。真的吗?从网络共享读取大文件只是为了检查它是否已更改?我希望您没有实现任何生产代码。
require "digest"

file_hash_pair =
Dir.glob("LOGS/**/*")
.select{|f| File.file?(f)}
.map{|f| [f, Digest::SHA1.hexdigest(File.read(f))]}