首页 > 解决方案 > 如何在数据库中存储 5MB 文件预览

问题描述

我有一个允许解析文件的应用程序。假设他们想要解析一个 1GB 的 csv 文件。应用程序的工作原理是它存储文件的 5MB 预览 - 只是文件中的前 5MB 数据 - 并允许他们对其应用设置,例如:什么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

    • 文件 ID (FK)
    • 数据

这样,只有当我直接查询该表时,我才需要加载所有数据。

  1. 通过网络加载 5MB 数据(无论是链接还是 blob)需要花费大量时间。为此,我正在考虑使用类似 redis 缓存的东西file_id:5_mb_data,但我最终需要大量空间。

什么是存储上述内容的好方法,以便我可以快速生成文件预览?

我将文件存储在 GCS 上,为了获取其中的任何一个(无论是完整文件还是其中的 5mb),我需要在本地下载它。

标签: mysqlsqlredisdatabase-performance

解决方案


正如 Uueerdo 建议的那样,将文件的预览存储在本地可能最有意义,例如命名md5_checksum以确保唯一性。这样你就不用担心有一个位于中心的缓存(比如redis),打开和读取一个5MB的文件只需要大约1/1000秒:

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

推荐阅读