从许多文件性能中读取字节
Reading bytes from many files performance
所以我有这段代码来检查目录中每个文件的文件类型。
只需要读取前 4 个字节并检查模式。
代码看起来有点复杂而且非常慢,但我想不出在 Nim 中更快的方法。
我做错了什么?
import os
var
buf {.noinit.}: array[4, char]
let out_pat = ['{', '\', 'r', 't']
var
flag = true
num_read = 0
var dirname = "/some/path/*"
for path in walkFiles(dirname):
num_read = open(path).readChars(buf, 0, 4)
for i in 0..num_read-1:
if buf[i] != out_pat[i]:
flag = false
if flag:
echo path
flag = true
为了比较,Python 代码快 2 倍:
def find_rtf(dir_):
for path in glob.glob(dir_):
with open(path,'rb') as f:
if f.read(4) == b'{\rt':
print(path)
find_rtf("/some/path/*")
和常规 cli,它比 Python 快 10 倍,但在遇到 10^6+ 文件时有一些管道错误
time find ./ -type f -print0 | LC_ALL=C xargs -0 -P 6 -n 100 head -c 5 -v| grep "{\\rt" -B 1
在我的系统 (Linux) 上,Nim 版本的速度是 Python 版本的两倍。但也许我的文件是错误的。您使用的是什么操作系统?
你应该关闭文件,如果文件小于 4 个字节,你的比较是错误的。这是一个小的清理:
import os
const
out_pat = ['{', '\', 'r', 't']
dirname = "/some/path/*"
for path in walkFiles(dirname):
var buf: array[4, char]
let file = open(path)
defer: close(file) # Always close file when it goes out of scope
discard file.readChars(buf, 0, 4)
if buf == out_pat:
echo path
确保使用 nim -d:release c foobar.nim
进行编译。
同时使用 6 个进程时,命令行版本要快得多。使用 -P 1
而不是 -P 6
对我来说它和 Nim 版本一样快。
所以我有这段代码来检查目录中每个文件的文件类型。 只需要读取前 4 个字节并检查模式。
代码看起来有点复杂而且非常慢,但我想不出在 Nim 中更快的方法。
我做错了什么?
import os
var
buf {.noinit.}: array[4, char]
let out_pat = ['{', '\', 'r', 't']
var
flag = true
num_read = 0
var dirname = "/some/path/*"
for path in walkFiles(dirname):
num_read = open(path).readChars(buf, 0, 4)
for i in 0..num_read-1:
if buf[i] != out_pat[i]:
flag = false
if flag:
echo path
flag = true
为了比较,Python 代码快 2 倍:
def find_rtf(dir_):
for path in glob.glob(dir_):
with open(path,'rb') as f:
if f.read(4) == b'{\rt':
print(path)
find_rtf("/some/path/*")
和常规 cli,它比 Python 快 10 倍,但在遇到 10^6+ 文件时有一些管道错误
time find ./ -type f -print0 | LC_ALL=C xargs -0 -P 6 -n 100 head -c 5 -v| grep "{\\rt" -B 1
在我的系统 (Linux) 上,Nim 版本的速度是 Python 版本的两倍。但也许我的文件是错误的。您使用的是什么操作系统?
你应该关闭文件,如果文件小于 4 个字节,你的比较是错误的。这是一个小的清理:
import os
const
out_pat = ['{', '\', 'r', 't']
dirname = "/some/path/*"
for path in walkFiles(dirname):
var buf: array[4, char]
let file = open(path)
defer: close(file) # Always close file when it goes out of scope
discard file.readChars(buf, 0, 4)
if buf == out_pat:
echo path
确保使用 nim -d:release c foobar.nim
进行编译。
同时使用 6 个进程时,命令行版本要快得多。使用 -P 1
而不是 -P 6
对我来说它和 Nim 版本一样快。