【发布时间】:2015-05-07 14:30:54
【问题描述】:
任务:
我正在处理 4 TB 的数据/文件,存储在外部 USB 磁盘上:图像、html、视频、可执行文件等。
我想使用以下架构索引 sqlite3 数据库中的所有这些文件:
path TEXT, mimetype TEXT, filetype TEXT, size INT
到目前为止:
我os.walk递归遍历挂载的目录,用python的子进程执行linuxfile命令,用os.path.getsize()获取大小。最后将结果写入数据库,存储在我的电脑上——当然,usb 是用 -o ro 挂载的。顺便说一句,没有线程
你可以在这里看到完整的代码http://hub.darcs.net/ampoffcom/smtid/browse/smtid.py
问题:
代码真的很慢。我意识到目录结构越深,代码越慢。我想,os.walk 可能是个问题。
问题:
- 是否有比 os.walk 更快的替代方案?
- 穿线会固定东西吗?
【问题讨论】:
-
确保您进行批量提交而不是使用自动提交。
-
如果
os.walk是你的瓶颈,那么即将到来的Python 3.5有os.scandir,它基本上是一个优化的os.walk。 -
我怀疑线程在这里会有很大帮助,因为这听起来您的代码主要受 I/O 限制。
-
如果你真的很想确定,那么你应该对它进行基准测试并找出时间的去向。如果我只是简单地推测,我猜想产生新进程的开销不小,看看guessing the file type using a libmagic binding for Python。
-
另外,我很确定有一些库可以在 PyPI 上包装
fts(几年前我自己写了一个,直到我发现一个已经完成了......),这会明显更快在大多数文件系统上都比scandir快(这已经比walk快了)。或者,如果您找不到,您可能需要子处理到find。 (是的,我给你的file正好相反……但在这里,它是一个做大量工作的子进程,而不是数百万只做很少工作的子进程。)
标签: python linux file sqlite subprocess