mysql - 如何在数据库中存储 5MB 文件预览
问题描述
我有一个允许解析文件的应用程序。假设他们想要解析一个 1GB 的 csv 文件。应用程序的工作原理是它存储文件的 5MB 预览 - 只是文件中的前 5MB 数据 - 并允许他们对其应用设置,例如:什么separator
是,什么quotechar
是等。
我的问题是存储这些数据的最佳方式是什么?我能想到的最简单的例子是:
- file_id (id)
- filename (varchar)
- file_url (varchar)
- [various file settings]
- data (longtext or blob)
这样,每当用户想要保存新设置时,我们都会将转换应用于data
存储的设置。
但是,我看到了两个问题:
该行本身会非常大,并且可能会像这样更好地存储:
file
- file_id (id)
- 文件名(varchar)
- file_url (varchar)
- [各种文件设置]
file_data
- 文件 ID (FK)
- 数据
这样,只有当我直接查询该表时,我才需要加载所有数据。
- 通过网络加载 5MB 数据(无论是链接还是 blob)需要花费大量时间。为此,我正在考虑使用类似 redis 缓存的东西
file_id:5_mb_data
,但我最终需要大量空间。
什么是存储上述内容的好方法,以便我可以快速生成文件预览?
我将文件存储在 GCS 上,为了获取其中的任何一个(无论是完整文件还是其中的 5mb),我需要在本地下载它。
解决方案
正如 Uueerdo 建议的那样,将文件的预览存储在本地可能最有意义,例如命名md5_checksum
以确保唯一性。这样你就不用担心有一个位于中心的缓存(比如redis),打开和读取一个5MB的文件只需要大约1/1000秒:
>>> timeit.timeit("with open('5mbfile', 'r') as f: _=f.read()", number=1000) / 1000
0.0011376328468322755
推荐阅读
- java - Spring-boot OAuth2 实现:NoSuchBeanDefinitionException:没有 AuthenticationManager 类型的合格 bean
- c - 两个 strlen() 函数的减法是如何工作的
- arrays - 打字稿数组接受错误的类型
- html - 如何在所有设备上将 ionic3 中的标题居中
- javascript - 如何使用 Javascript 以“2018 年 8 月 29 日 3:12:32 PM IST”格式获取当前时间?
- python - 输入输出不同维度的Tensorflow自定义梯度
- laravel - Laravel 外键参考
- c++ - boost::asio 挂起 _endthreadx
- javascript - 只有在另一个函数在 javascript 中完成后,才使用 promises 调用一个函数
- c++ - QFile“remove()”不删除在执行时众所周知的文件