我在java中编写了一种同步工具。基本上,它从Web服务器下载存储库,该服务器表示本地计算机上的文件/目录结构,并以压缩形式定义所需文件的源,并结合哈希值来验证文件。我猜是一个基本的东西。
{"name":"subset1", "mods":[
{
"modfolder":"mod1",
"modfiles":[
{
"url":"http://www.example.com/file2.7z",
"localpath":"mod1/file2",
"size":5,
"sizecompressed":3,
"checksum":"46aabad952db3e21e273ce"
},
{
"url":"http://www.example.com/file1.7z",
"localpath":"mod1/file1",
"size":9,
"sizecompressed":4,
"checksum":"862f90bafda118c4d3c5ee6477"
}
]
},
{
"modfolder":"mod2",
"modfiles":[
{
"url":"http://www.example.com/file3.7z",
"localpath":"mod2/file3",
"size":8,
"sizecompressed":4,
"checksum":"cb1e69de0f75a81bbeb465ee0cdd8232"
},
{
"url":"http://www.example.com/file1.7z",
"localpath":"mod2/file1",
"size":9,
"sizecompressed":4,
"checksum":"862f90bafda118c4d3c5ee6477"
}
]
}
]}
mod1/
file2
file1
mod2/
file3
file1
// mod1/file2 == mod2/file2
关于存储库的一个特殊事项: 从服务器获取的存储库仅代表更大存储库的子集,因为用户只需要一个正在改变(也重叠)的子树。 有时,存储库由mod1和mod2组成,有时是mod1和mod3,依此类推。
答案 0 :(得分:2)
平行这些工作的最佳策略是什么?
你有I / O.并且,可能如果一个目录上的一个作业已在进行中,则另一个作业不能同时在同一目录上运行。
所以,你需要在这里锁定。建议:在文件系统上使用锁定目录,并使用目录而不是文件来锁定。为什么?因为目录创建是原子的(第一个原因),并且因为Java 6不支持原子文件创建(第二个原因)。实际上,您甚至可能需要两个锁定目录:一个用于内容下载,另一个用于内容处理。
你已经完成了下载与处理的分离,所以我在这里没有更多的内容;)
我不确定你为什么要缓存校验和呢?它看起来对我没什么用......
另外,我不知道你要处理的文件有多大,但是为什么还要检查现有的目录内容等而不是提取新目录并重命名?即:
newdir
; dstdir
移至dstdir.old
; newdir
移至dstdir
; dstdir.old
。这甚至意味着您可以并行化报废,但这是太多的I / O并行化......您将不得不限制执行实际I / O的线程数。
编辑以下是我将如何分开处理:
MD5SUMS
); 请注意,如果校验和很重,则可以并行化。