Сравниваем 2 огромных (5-6 Гб) csv файлов и подсчитываем количество совпадающих и несовпадающих нет. рядов

Есть 2 огромных (5-6 ГБ) csv-файла каждый. Теперь цель состоит в том, чтобы сравнить оба этих файла. сколько строк совпало и сколько строк не совпало?

Допустим, файл file1.csv содержит 5 одинаковых строк, нам нужно считать его за 1, а не за 5. Точно так же для file2.csv, если есть избыточные данные, нам нужно считать их как 1.

Я ожидаю, что на выходе будет отображаться количество совпадающих строк и нет. строк, которые отличаются.

Загрузите два файла в базу данных документов (MongoDb, CouchDB,...) как две коллекции, причем каждая строка файлов имеет свой собственный хеш-ключ. Сравните хеш-ключи, чтобы найти совпадения.

framontb 20.05.2019 09:33

Файлы в том же порядке?

gbalduzzi 20.05.2019 09:34

Будет ли это работать @framontb, если они идентичны, но в одном просто отсутствует первая строка?

Mark 20.05.2019 09:35

Он найдет одинаковые строки без порядка. Первая строка в файле будет соответствовать последней строке другого.

framontb 20.05.2019 09:36

Скажем, в файле 1 есть повторяющиеся строки, считается ли одинаковым, если эти повторяющиеся строки появляются в файле 2 одинаковое количество раз? Можете ли вы добавить все эти случаи также в ваше описание.

Praveenkumar 20.05.2019 09:38

@framontb Файл существует на машине с Linux, и у нас там нет MongoDb. Мы используем Хайв.

Kaushik 20.05.2019 10:04

Я не знаю Хайва. Возможно, вы могли бы использовать трансформация для создания хэша построчно, удаления дубликатов, затем сортировки, последнего сравнения.

framontb 20.05.2019 10:22

В качестве первого шага я бы рекомендовал удалить заголовки, отсортировать строки и удалить дубликаты; это можно легко сделать с помощью инструментов командной строки, таких как tail (есть параметр, который заставляет выводить все, кроме первой строки), sort (для сортировки строк) и uniq (для удаления дубликатов после сортировки) и сделать сравнение потом легче/быстрее.

Haroldo_OK 21.05.2019 14:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я написал компаратор файлов на python, который может оптимально сравнивать огромные файлы и получать количество совпадающих строк и количество разных строк. Замените input_file1 и input_file2 двумя большими файлами и запустите его. Дайте мне знать результаты.

input_file1 = r'input_file.txt'
input_file2 = r'input_file.1.txt'

__author__ = 'https://github.com/praveen-kumar-rr'

# Simple Memory Efficient high perfomance file comparer.
# Can be used to efficiently compare large files.

# Alogrithm:
# Hashes the lines and compared first.
# Non matching lines are picked as different count.
# All the matching lines are taken and the exact lines are read from file
# These strings undergo same comparison process based on string itself


def accumulate_index(values):
    '''
    Returns dict like key: [indexes]
    '''
    result = {}
    for i, v in enumerate(values):
        indexes = result.get(v, [])
        result[v] = indexes + [i]
    return result


def get_lines(fp, line_numbers):
    '''
    Reads lines from the file pointer based on the lines_numbers list of indexes
    '''
    return (v for i, v in enumerate(fp) if i in line_numbers)


def get_match_diff(left, right):
    '''
    Compares the left and right iterables and returns the matching and different items
    '''
    left_set = set(left)
    right_set = set(right)
    return left_set ^ right_set, left_set & right_set


if __name__ == '__main__':
    # Gets hashes of all lines for both files
    dict1 = accumulate_index(map(hash, open(input_file1)))
    dict2 = accumulate_index(map(hash, open(input_file2)))

    diff_hashes, matching_hashes = get_match_diff(
        dict1.keys(), dict2.keys())

    diff_lines_count = len(diff_hashes)

    matching_lines_count = 0
    for h in matching_hashes:
        with open(input_file1) as fp1, open(input_file2) as fp2:
            left_lines = get_lines(fp1, dict1[h])
            right_lines = get_lines(fp2, dict2[h])
            d, m = get_match_diff(left_lines, right_lines)
            diff_lines_count += len(d)
            matching_lines_count += len(m)

    print('Total number of matching lines is : ', matching_lines_count)
    print('Total number of different lines is : ', diff_lines_count)

Я надеюсь, что этот алгоритм работает

  1. создать хэш каждой строки в обоих файлах
  2. теперь создайте набор этого хэша
  3. разность и пересечение этого множества.

Другие вопросы по теме