Как работать с массивными текстовыми файлами с NodeJS - PullRequest
1 голос
/ 06 июня 2019

Мы работаем с данными на основе API, которые позволяют нам анализировать большие наборы данных ГИС относительно предоставленных областей GeoJSON и указанных временных отметок.Когда данные агрегируются нашим провайдером, они могут быть помечены как полные и оповещать нашу службу через URL обратного вызова.Оттуда у нас есть список отчетов, которые мы создали, с соответствующими ссылками на скачивание.Одним из отчетов, с которым нам нужно работать, является файл TSV с 4 столбцами, который выглядит следующим образом:

deviceId | timestamp | lat | lng

Иногда, если анализируемая область достаточно велика,Эти файлы могут быть размером более 60 ГБ.Ссылка для скачивания ссылается на заархивированную версию файлов, поэтому мы не можем прочитать их непосредственно с URL-адреса загрузки.Мы пытаемся получить данные в этом TSV, сгруппированные по идентификатору устройства и отсортированные по метке времени, чтобы мы могли прокладывать маршрут вдоль дорожных сетей, используя широту / долготу в нашей службе маршрутизации.До сих пор мы использовали Javascript для большинства наших приложений, но этот сервис создает уникальные проблемы, которые могут потребовать дополнительного программного обеспечения и / или языков.

Любопытно, как другие подошли к проблеме обработки и обработки данных такого размера.

Мы попытались загрузить файл, передать его в ReadStream и выделить все доступные ядра на машине для индивидуальной обработки пакетов данных.Это работает, но не так быстро, как хотелось бы (даже с 36 ядрами).

1 Ответ

0 голосов
/ 06 июня 2019

Из Википедия :

Инструменты, которые правильно читают ZIP-архивы, должны сканировать конец подписи записи центрального каталога, а затем, при необходимости, другие указанные записи центрального каталога. Они не должны сканировать записи в верхней части ZIP-файла, потому что ... только центральный каталог указывает, где начинается фрагмент файла и что он не был удален. Сканирование может привести к ложным срабатываниям, так как формат не запрещает другим данным находиться между порциями, а также файловым потокам данных, содержащим такие подписи.

Другими словами, если вы попытаетесь сделать это, не посмотрев сначала на конец zip-файла, вы можете случайно включить в себя удаленные файлы. Таким образом, вы не можете доверять потоковым распаковщикам. Однако, если zip-файл не был изменен с момента его создания, возможно, потоковые парсеры можно доверять. Если вы не хотите рисковать, не используйте потоковый анализатор. (Это означает, что вы были правы, сначала загрузив файл на диск.)

В некоторой степени это зависит от структуры zip-архива: если он состоит из множества файлов среднего размера, и если все они могут обрабатываться независимо, тогда вам не нужно иметь слишком много его в памяти в любой момент. один раз. С другой стороны, если вы попытаетесь обрабатывать много файлов параллельно, вы можете столкнуться с ограничением числа файловых дескрипторов, которые могут быть открыты. Но вы можете обойти это, используя что-то вроде queue .

Вы говорите, что должны отсортировать данные по идентификатору устройства и отметке времени. Это еще одна часть процесса, которую нельзя транслировать. Если вам нужно отсортировать большой список данных, я бы рекомендовал сначала сохранить его в базе данных; Таким образом, вы можете сделать его настолько большим, насколько позволит ваш диск, но и структурированным. У вас будет таблица, в которой столбцы - это столбцы TSV. Вы можете выполнять потоковую передачу из файла TSV в базу данных, а также индексировать базу данных по deviceId и timestamp. И под этим я подразумеваю один индекс, который использует оба столбца в указанном порядке.

Если вам нужна распределенная инфраструктура, возможно, вы могли бы хранить разные идентификаторы устройств на разных дисках с разными процессорами и т. Д. (Слово «sharding» - это слово, которое вы хотите Google). Но я не знаю, будет ли это быстрее. Это ускорит доступ к диску. Но это может создать узкое место в сетевых подключениях из-за задержки или пропускной способности, в зависимости от того, насколько взаимосвязаны различные идентификаторы устройств.

О, и если вы собираетесь запускать несколько экземпляров этого процесса параллельно, не забудьте создать отдельные базы данных или, по крайней мере, добавить еще один столбец в базу данных, чтобы различать отдельные экземпляры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...