Algorithm 大文件的文件差异
我需要用java编写这个任务。 我有两个5GB左右的大文件,每个文件包含多行文本数据。每行是一行逗号分隔的字段,例如“名称、empId、名称、地址……等等,最多30个字段”。我需要读取这两个文件,并将记录写入另一个文件,该文件带有附加字段,指定给定数据行已更改、未更改、添加或删除。 比如说 File1 汤姆,E100,工程师 里克,E200,工程师 文件2 汤姆,E100,经理 保罗,E300,职员 ResultFile 汤姆,E100,经理,换了 保罗,E300,职员,补充道 瑞克,E200,工程师,删除 我使用的方法是从file1的数据创建一个映射,使用empId作为键,使用整个数据行作为值(假设empId是唯一的),然后从file2读取每个记录以检查映射中的数据(我不是将file2的全部内容读取到内存中,而是仅使用file1来创建映射)。我使用BufferedReader/BufferedWriter进行读写 这种方法很好,但只适用于小数据文件。给定运行到GBs的数据文件,我的程序在尝试创建地图时很快就会耗尽内存 在内存和执行速度方面,实现此任务的正确方法是什么 谢谢,Algorithm 大文件的文件差异,algorithm,memory-management,data-structures,large-files,large-data-volumes,Algorithm,Memory Management,Data Structures,Large Files,Large Data Volumes,我需要用java编写这个任务。 我有两个5GB左右的大文件,每个文件包含多行文本数据。每行是一行逗号分隔的字段,例如“名称、empId、名称、地址……等等,最多30个字段”。我需要读取这两个文件,并将记录写入另一个文件,该文件带有附加字段,指定给定数据行已更改、未更改、添加或删除。 比如说 File1 汤姆,E100,工程师 里克,E200,工程师 文件2 汤姆,E100,经理 保罗,E300,职员 ResultFile 汤姆,E100,经理,换了 保罗,E300,职员,补充道 瑞克,E200,
LX一种不同的方法是基于密钥对每个文件执行一次迭代,然后并行迭代它们 高级伪代码:
sort(file1)
sort(file2)
iter1 = file1.begin()
iter2 = file2.begin()
while (iter1 != file1.end() && iter2 != file2.end()):
element1 = iter1.getElement()
element2 = iter2.getElement()
if element1.key() == element2.key():
// same element, check if changed
iter1 = iter1.next()
iter2 = iter2.next()
else if element1.key() < element2.key()
// element1 is not in file2, so it is removed.
iter1 = iter1.next()
else
// element2 is in file2 but not in file1, so it's added
iter2 = iter2.next()
while (iter1 != list1.end()):
element1 = iter1.getElement()
// element1 is removed
iter1 = iter1.next()
while (iter2 != list2.end()):
element2 = iter2.getElement()
// element2 is added
iter2 = iter2.next()
排序(文件1)
排序(文件2)
iter1=file1.begin()
iter2=file2.begin()
而(iter1!=file1.end()&&iter2!=file2.end()):
element1=iter1.getElement()
element2=iter2.getElement()
如果element1.key()==element2.key():
//相同的元素,检查是否已更改
iter1=iter1.next()
iter2=iter2.next()
else if element1.key()
这需要排序,在进行外部排序时,可以使用很少的内存签名来完成排序,接下来的循环也使用恒定的内存量。
复杂性是
O(mlogm+nlogn)
,其中n,m
是列表大小您能按empId排序文件吗?这样就不需要在内存中存储任何文件。(因此可能会按empId对它们进行排序)。相关:对于这样大小的文件,这几乎是唯一合理的选择。