Algorithm 大文件的文件差异

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,

我需要用java编写这个任务。 我有两个5GB左右的大文件,每个文件包含多行文本数据。每行是一行逗号分隔的字段,例如“名称、empId、名称、地址……等等,最多30个字段”。我需要读取这两个文件,并将记录写入另一个文件,该文件带有附加字段,指定给定数据行已更改、未更改、添加或删除。 比如说

File1

汤姆,E100,工程师

里克,E200,工程师

文件2

汤姆,E100,经理

保罗,E300,职员

ResultFile

汤姆,E100,经理,换了

保罗,E300,职员,补充道

瑞克,E200,工程师,删除

我使用的方法是从file1的数据创建一个映射,使用empId作为键,使用整个数据行作为值(假设empId是唯一的),然后从file2读取每个记录以检查映射中的数据(我不是将file2的全部内容读取到内存中,而是仅使用file1来创建映射)。我使用BufferedReader/BufferedWriter进行读写

这种方法很好,但只适用于小数据文件。给定运行到GBs的数据文件,我的程序在尝试创建地图时很快就会耗尽内存

在内存和执行速度方面,实现此任务的正确方法是什么

谢谢,
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对它们进行排序)。相关:对于这样大小的文件,这几乎是唯一合理的选择。