2015-06-01 5 views
1

Учитывая файл с разделителями строкой JSON записей:JSON файл журнал уплотнительной

{"id": 1, "position": 1234} 
{"id": 2, "position": 23} 
{"id": 3, "position": 43} 
{"id": 1, "position": 223} 

Я хотел бы компактного такого файла, сохраняя только последнюю запись для идентификатора, например, для приведенного выше примера, я хотел бы иметь в качестве выходного сигнала:

{"id": 2, "position": 23} 
{"id": 3, "position": 43} 
{"id": 1, "position": 223} 

tldr; Есть ли uniq, который работает с разделителем строк JSON (и быстро)?


Входные файлы могут содержать 1 миллиард записей, из которых может быть выброшено 10-20% записей.

Я пробовал различные подходы:

  1. Seen Идентификаторы

    Держите набор "видели" идентификаторов в памяти. Это заканчивается из памяти.

  2. Сортировка и уникальный

    Сортировка файлов по «ид» первый (со стабильной рода, так что сохраняется порядок). Затем снова запустите файл и просто сохраните последнюю запись. Это похоже на обычный подход unix sort | uniq. Сортировка здесь дорого и, возможно, слишком большая работа.

  3. Извлечение смещения и информация о длине

    экстракт смещение и длина информации и идентификатор из файла, например,

    id offset length 
    1 0  27 
    2 27  25 
    3 52  25 
    1 77  26 
    

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


Что может быть лучше, быстрее (или быстрее)? Существуют ли существующие инструменты, которые решают эту проблему?

+0

Любое предпочтение на каком языке должно происходить уплотнение? –

+0

@BerndLinde, язык не имеет значения. Меня больше интересует общий подход или существующие инструменты. – miku

ответ

0

Эта проблема может быть решена с помощью три этапа:

  1. Извлечение интересные значения (плюс номер строки) с инструментами, как jq или ldjtab.
  2. Используйте tac и sort -u, чтобы сохранить только соответствующие строки.
  3. Исправить исходный файл и сохранить только указанные строки (такие инструменты, как filterline или один a few other approaches, будут фильтровать файл и содержать только определенные строки).

Весь процесс довольно эффективен. Шаг 1 и 2 параллельны. Шаг 3 может быть сделан fast.