我有一个允许解析文件的应用程序。假设他们想要解析一个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
- file_id(FK(
- 数据
这样,只有当我直接查询该表时,我才需要加载所有数据。
- 通过网络加载5MB数据(无论是链接还是blob(都需要花费大量时间。为此,我想为
file_id:5_mb_data
使用类似redis缓存的东西,但我最终需要ton的空间
什么是存储上述内容的好方法,以便我可以快速生成文件预览?
我将文件存储在GCS上,为了获得任何文件(无论是完整文件还是5mb(,我需要在本地下载。
正如Uueerdo所建议的,在本地存储文件的预览可能最有意义,例如名为md5_checksum
的文件,以确保唯一性。这样,您就不必担心有一个位于中心的缓存(如redis(,打开和读取一个5MB的文件只需要大约1/1000秒:
>>> timeit.timeit("with open('5mbfile', 'r') as f: _=f.read()", number=1000) / 1000
0.0011376328468322755