Доступ к произвольной строке в большом файле в 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-disequilibrium/1000-genomes-phase-3/ldCutoff0.4_window1MB
Было бы здорово, если бы я мог просто получить дескриптор файловой системы, используя FUSE, чтобы я мог поместить данные непосредственно в другие скрипты - но я согласен с необходимостью переписывать их для чтения построчно, если это то, что необходимо. Главное - ни при каких обстоятельствах интерфейс не должен загружать весь файл.
1 ответ
Заголовок Range позволяет загружать определенные смещения байтов из файла с помощью XML API.
Нет прямого способа получить определенную строку, так как GCS не знает, где в файле начинается или заканчивается какая-либо строка. Инструменты для поиска конкретной строки обычно читают весь файл, чтобы посчитать разрывы строк, чтобы найти нужную строку.
Если в файле есть номера строк, вы можете выполнить бинарный поиск, чтобы найти нужную строку. Вы бы запросили маленькие куски, проверили номер строки, а затем попробовали другое местоположение, основываясь на этом, пока не найдете нужную строку.
если в файле нет номеров строк, вы можете выполнить предварительную обработку, чтобы сделать это возможным. Перед начальной загрузкой файла вы можете отсканировать файл и записать расположение байтов каждой N-й строки. Затем, чтобы получить нужную строку, вы ищите местоположение байта в этом индексе и можете сделать запрос диапазона для соответствующего раздела.