如何将文件名哈希为较小的数字或数字以进行输出处理



我不是Perl程序员,但我继承了要进入目录的现有代码,查找该文件夹和子文件夹(通常是JPG或Office文件)中的所有文件,然后将其转换为单个文件以用于加载到SQL Server数据库中。客户有大约 500,000 个这样的文件。

创建文件大约需要 45 分钟,然后 SQL 加载数据还需要 45 分钟。粗略地说,它每秒大约 150 次,这是合理的,但时间是工作的问题。我不想使用其他技术的原因有很多,所以除非与此过程密切相关,否则请不要建议其他选项。

我正在考虑的是通过并发运行 10 个进程来提高速度。每个进程将传递另一个参数 (0-9)。每个进程都会像当前一样进入目录并查找所有文件,但对于找到的每个文件,它会将文件名散列或压缩到一位数 (0-9),如果与提供的参数匹配,则进程将处理该文件并将其写出到它的唯一文件流中。

然后我最后会有 10 个输出文件。我怀疑SQL Server端是否可以改进,因为我必须加载到单独的表中,然后在数据库中合并,并且由于这些是BLOB对象,因此不会很快。

所以我正在寻找一些基本的代码或线索,说明在Perl中使用什么函数来获取变量(文件名$File)并基于该变量生成单个0到9值。这可能是通过获取每个字符的 ascii 值来完成的,然后将这些值加在一起得到一个长数字,然后将这些单独的数字相加,最终你会得到一个答案。

有什么线索或建议的技术吗?

以下是unpack函数文档中建议的一个易于实现的方法:

sub string_to_code {
# convert an arbitrary string to a digit from 0-9
my ($string) = @_;
return unpack("%32W*",$string) % 10;
}

最新更新