Конкатенация файлов JSON в S3 - PullRequest
0 голосов
/ 25 января 2019

У меня есть рабочий процесс, который раскручивает кучу параллельных лямбда-функций для быстрой пакетной обработки данных, которые запускают службу, а затем записывают ответ JSON в корзину S3.В результате у меня могут быть тысячи файлов JSON размером более 5 МБ.

Теперь мне нужно объединить все эти файлы в один файл JSON, который можно вернуть запрашивающей стороне.

Я былпытаясь сделать это с помощью MultiPart Upload , поэтому мне не пришлось загружать, обрабатывать и повторно загружать файлы.Вместо этого я мог сделать все это исключительно в S3, скопировав детали в окончательный файл.Это на самом деле прекрасно работает, но проблема в том, что результат больше не является допустимым JSON, потому что он буквально просто склеивает файлы и не объединяет массивы JSON (см. Ниже).

Например:

Файл 1:

[
    {
    "foo": "bar1"
    },
    {
    "foo": "bar2"
    }
]

Файл 2:

[
    {
    "foo": "bar3"
    },
    {
    "foo": "bar4"
    }
]

Результат многоэтапной загрузки:

[
    {
    "foo": "bar1"
    },
    {
    "foo": "bar2"
    }
][
    {
    "foo": "bar3"
    },
    {
    "foo": "bar4"
    }
]

Как вы можете видеть выше, теперь у меня есть недопустимый JSON с конечной скобкой для одного файла и начальной скобкой для другого вместо запятой.

Результат, который я хочу:

[
    {
    "foo": "bar1"
    },
    {
    "foo": "bar2"
    },
    {
    "foo": "bar3"
    },
    {
    "foo": "bar4"
    }
]

Теперь я застрял на том, что делать.Ограничение в 3 ГБ ОЗУ означает, что я не могу просто открыть каждый файл и создать конечный результат в памяти, а затем записать в S3, поскольку он может легко составлять> 3 ГБ.

Есть ли какие-то варианты, которые я пропускаю, или мне просто нужно написать какой-нибудь неприятный код, чтобы переборщили его?

Единственное, о чем я могу думать (что я действительно не хочу делать), это отформатировать первый файл без конечной скобки, средние файлы без скобок и последний файл без начальной скобки.

Head file
[
    {
        "foo": "bar1"
    },
Any middle files
    {
        "foo": "bar2"
    },
Final file
    {
        "foo": "barN"
    }
]

, чтобы, когда я делаюсоединение через Multipart Copy будет правильным ...

[
    {
        "foo": "bar1"
    },
    {
        "foo": "bar2"
    },
    {
        "foo": "barN"
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...