Доступ к случайной строке в большом файле в Google Cloud Storage

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

Насколько я понимаю, я не могу сделать это с помощью gsutil и изучил FUSE, но не уверен, что он подойдет для моего варианта использования: https://cloud.google.com/storage/docs/gcs-fuse

Есть много файлов, каждый размером ~ 50 ГБ, всего несколько терабайт. Если возможно, я хотел бы избежать загрузки этих файлов. Все они представляют собой простые текстовые файлы — вы можете увидеть их здесь: https://console.cloud.google.com/storage/browser/genomics-public-data/linkage-disescence/1000-genomes-phase.-3/ldCutoff0.4_window1MB

Было бы здорово, если бы я мог просто получить дескриптор файловой системы с помощью FUSE, чтобы я мог помещать данные непосредственно в другие сценарии, но я не против переписать их для чтения построчно, если это необходимо. Главное — ни при каких обстоятельствах интерфейс не должен загружать весь файл.


person user491880    schedule 24.10.2018    source источник


Ответы (1)


Заголовок Range позволяет загружать определенные смещения в байтах. из файла с помощью XML API.

Не существует прямого способа получить конкретную строку, так как GCS не знает, где в файле начинается/заканчивается та или иная строка. Инструменты для поиска определенной строки обычно читают весь файл, чтобы подсчитать разрывы строк и найти нужную строку.

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

если в файле нет номеров строк, вы можете выполнить предварительную обработку, чтобы сделать это возможным. Перед начальной загрузкой файла вы можете отсканировать файл и записать расположение байтов каждой N-й строки. Затем, чтобы получить нужную строку, вы ищете расположение байтов в этом индексе и можете сделать запрос диапазона для соответствующего раздела.

person David    schedule 24.10.2018