Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 从大型文件中删除重复项_Algorithm_File Io_Large Files - Fatal编程技术网

Algorithm 从大型文件中删除重复项

Algorithm 从大型文件中删除重复项,algorithm,file-io,large-files,Algorithm,File Io,Large Files,我们有大量的数据,我们想对它们执行一些操作。删除重复项是主要操作之一 前 这是一个文件中的三个条目,我们希望在第一列的基础上删除重复项。所以,第三行应该被删除。每行可能有不同数量的列,但我们感兴趣的列将始终存在 内存操作看起来不可行 另一种选择是将数据存储在数据库中并从中删除重复项,但这同样不是一项简单的任务。 我应该遵循什么设计将数据转储到数据库并删除重复数据 我认为人们一定已经面对了这样的问题并解决了它 我们通常如何解决这个问题 P:请考虑这是一个真实的生活问题而不是面试问题;p> 如果输入

我们有大量的数据,我们想对它们执行一些操作。删除重复项是主要操作之一

这是一个文件中的三个条目,我们希望在第一列的基础上删除重复项。所以,第三行应该被删除。每行可能有不同数量的列,但我们感兴趣的列将始终存在

内存操作看起来不可行

另一种选择是将数据存储在数据库中并从中删除重复项,但这同样不是一项简单的任务。 我应该遵循什么设计将数据转储到数据库并删除重复数据

我认为人们一定已经面对了这样的问题并解决了它

我们通常如何解决这个问题


P:请考虑这是一个真实的生活问题而不是面试问题;p> 如果输入已排序或可以排序,则只需在内存中存储一个值即可:

r = read_row()
if r is None:
    os.exit()
last = r[0]
write_row(r)
while True:
    r = read_row()
    if r is None:
        os.exit()
    if r[0] != last:
        write_row(r)
        last = r[0]
否则:

我要做的是保留一组我已经看到的第一列值,如果该行在该列中,则删除该行

S = set()
while True:
    r = read_row()
    if r is None:
       os.exit()
    if r[0] not in S:
       write_row(r)
       S.add(r[0])

这将仅使用与第一列中的值集大小成比例的内存在输入上流动。

如果输入已排序或可以排序,则可以这样做,只需在内存中存储一个值:

r = read_row()
if r is None:
    os.exit()
last = r[0]
write_row(r)
while True:
    r = read_row()
    if r is None:
        os.exit()
    if r[0] != last:
        write_row(r)
        last = r[0]
否则:

我要做的是保留一组我已经看到的第一列值,如果该行在该列中,则删除该行

S = set()
while True:
    r = read_row()
    if r is None:
       os.exit()
    if r[0] not in S:
       write_row(r)
       S.add(r[0])

这将仅使用与第一列中的值集大小成比例的内存在输入上进行流式处理。

如果唯一键的数量不是非常多,您可以简单地执行此操作
(伪代码,因为您没有提到语言)


如果唯一键的数量不是非常高,您可以简单地这样做
(伪代码,因为您没有提到语言)


如果键的数量也无法加载到内存中,则必须执行稳定的(保留顺序的)外部合并排序来对数据进行排序,然后执行线性扫描来删除重复项。或者,您可以修改外部合并排序,以便在合并已排序的运行时提供重复消除


我想这不是面试问题,效率/优雅似乎也不是问题(?)。编写一个hack python脚本,创建一个以第一个字段作为主键的表。解析此文件并将记录插入数据库,将插入内容包装到try-except语句中。然后在表上执行select*,解析数据并逐行将其写回文件。

如果键的数量也无法加载到内存中,则必须执行稳定(保留顺序)的外部合并排序以对数据进行排序,然后执行线性扫描以删除重复项。或者,您可以修改外部合并排序,以便在合并已排序的运行时提供重复消除


我想这不是面试问题,效率/优雅似乎也不是问题(?)。编写一个hack python脚本,创建一个以第一个字段作为主键的表。解析此文件并将记录插入数据库,将插入内容包装到try-except语句中。然后在表上执行select*,解析数据并逐行将其写回文件。

如果您选择数据库路径,您可以将csv加载到数据库中并使用“复制密钥更新”

使用mysql:-

  • 创建一个表,其中包含与您的数据相匹配的行(您可能只需要2行即可完成—id和数据)
  • 使用以下内容转储数据:

    将数据本地填充“rs.txt”替换加载到以“,”结尾的表格数据_表格字段中

  • 然后,您应该能够将数据转储回csv格式,而无需重复


  • 如果您选择数据库路径,则可以将csv加载到数据库中并使用“复制密钥更新”

    使用mysql:-

  • 创建一个表,其中包含与您的数据相匹配的行(您可能只需要2行即可完成—id和数据)
  • 使用以下内容转储数据:

    将数据本地填充“rs.txt”替换加载到以“,”结尾的表格数据_表格字段中

  • 然后,您应该能够将数据转储回csv格式,而无需重复


  • 如果您需要在原始数据中保持顺序,创建位置和数据元组的新数据,然后对要重复数据消除的数据进行排序可能是明智的。按数据排序后,重复数据消除(本质上)就是一次线性扫描。之后,您可以通过对元组的位置部分进行排序来重新创建原始顺序,然后将其剥离

    假设你有以下数据:a,c,a,b

    对于按数据排序的pos/数据元组,我们最终得到:0/a、2/a、3/b、1/c

    然后我们可以进行重复数据消除,只需选择要保留的第一个条目或最后一个条目(我们还可以在占用更多内存的情况下保留另一个条目),然后得到:0/a、3/b、1/c

    然后,我们按位置排序并剥离:a,c,b


    这将涉及对数据集的三次线性扫描和两个排序步骤。

    如果需要保留原始数据的顺序,可以创建位置和数据元组的新数据,然后对要重复数据消除的数据进行排序。按数据排序后,重复数据消除(本质上)就是一次线性扫描。之后,您可以通过对元组的位置部分进行排序来重新创建原始顺序,然后将其剥离

    假设你有以下数据:a,c,a,b

    对于按数据排序的pos/数据元组,我们最终得到:0/a、2/a、3/b、1/c

    然后我们可以进行重复数据消除,只需选择要保留的第一个条目或最后一个条目(我们还可以在占用更多内存的情况下保留另一个条目),然后得到:0/a、3/b、1/c

    然后,我们按位置排序并剥离:a,c,b

    这需要对数据进行三次线性扫描