以最快的速度统计数百万个文件

时间:2016-09-19 03:59:24

标签: python performance file-io comparison stat

所以我想做一些"大数据"分析一些科学数据文件。更具体地说,我想收集这些文件的atime,mtime和ctimes,以确定适当的分层存储管理策略,从而有效地规划存储层。

约束是:

  • 我们有很多solaris系统(zfs)和一些linux
  • 我们有十亿个+文件
  • 我们可能有~100个存储服务器

我已经设置了所有设置为令人尴尬的并行化'数据收集。

我使用find命令进行了调查,但solaris版本相当有限(没有-print)。所以我决定写一个python脚本来收集数据。它看起来像这样:

def os_path_get( filename ):
  return {
    'atime': os.path.getatime( filename ),
    'mtime': os.path.getmtime( filename ),
    'ctime': os.path.getctime( filename ),
    'size': os.path.getsize( filename )
  }

def stat_get( filename ):
  (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.lstat( filename )
  return {
    'atime': atime,
    'mtime': mtime,
    'ctime': ctime,
    'size': size,
    'inode': ino,
  }

for root, directory, filenames in os.walk(this):
  for filename in filenames:
    path = os.path.join(root,filename)
    if not os.path.islink( path ):
      # d = os_path_get( path )
      d = stat_get( path )
      print "%s\t%s\t%s\t%s" % ( d['size'], d['ctime'], d['mtime'], d['atime'] )

(我可能会转储now()时间,或者在输出中处理差异计算)

然而,在一个测试服务器上,有大约5200万个文件,用os_path_get()运行大约需要70个小时。

我使用stat_get()而不是os_path_get()的非科学测试是后者可能慢了约50%。

有关如何提高此元数据收集速度的任何建议? (多个线程...... os.scandir() ......?)

0 个答案:

没有答案