Как сохранить предварительный просмотр 5 МБ файла в БД - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть приложение, которое позволяет анализировать файл.Допустим, они хотят проанализировать CSV-файл объемом 1 ГБ.Как работает приложение, оно сохраняет предварительный просмотр файла размером 5 МБ - только первые 5 МБ данных в файле - и позволяет им применять к нему настройки, например: что такое separator, что такое quotecharи т. д.

Мой вопрос: как лучше всего хранить эти данные?Самым простым примером, который я могу придумать, будет:

- file_id (id)
- filename (varchar)
- file_url (varchar)
- [various file settings]
- data (longtext or blob)

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

Тем не менее, я вижу две проблемы с этим:

  1. Сама строка будет очень большой и, вероятно, будет храниться лучше так:

    file

    • file_id (id)
    • имя файла (varchar)
    • file_url (varchar)
    • [различные настройки файла]

    file_data

    • file_id (FK)
    • data

Таким образом, только если я запрашиваютаблица непосредственно мне нужно загрузить все эти данные.

Требуется нетривиальное количество времени для загрузки 5 МБ данных по сети (будь то ссылка или большой двоичный объект).Для этого я думал использовать что-то вроде кэша redis для file_id:5_mb_data, но мне в конечном итоге понадобится ton места для этого.

Что может быть хорошим способом для хранения вышеупомянутого, чтобы я мог быстро создавать предварительный просмотр файла на лету?

Я храню файлы наGCS, и для того, чтобы получить какой-либо из них (будь то полный файл или 5 МБ), мне нужно загрузить его локально.

1 Ответ

0 голосов
/ 20 ноября 2018

Как предположил Ууэрдо, наиболее разумно было бы сохранить предварительный просмотр файла локально, например, с именем md5_checksum, чтобы обеспечить уникальность.Таким образом, вам не нужно беспокоиться о централизованном расположении кэша (например, redis), а открытие и чтение файла размером 5 МБ занимает всего около 1/1000 секунды:

>>> timeit.timeit("with open('5mbfile', 'r') as f: _=f.read()", number=1000) / 1000
0.0011376328468322755
...