问下站内大神们 成千上万的小说-存储方案
1.数据库存储
2.磁盘存储
3.oss 存储
- ?
结合 速度和成本 最好的会是那种方案呢?
个人倾向于磁盘 速度快成本低
团队倾向于 oss
有分布式要求吗? 没有就磁盘,有就对象存储数据库只在你需要大量全文检索的时候再说
你团队是对的,磁盘你怎么管理元数据?
怎么可能直接存磁盘啊, 打算自己造几年轮子啊.
当然是现成的 OSS ,你估计下各种方案最终落地需要的时间
不都是存数据库吗?一本小说 20M,存 oss 咋打开?
oss 对于密集操作,很不友好,网络 IO 开销太大了 暂时没有分布式要求 磁盘只要存 章节内容就行了, 章节的元数据存数据库 用磁盘主要是 方便 和 性能的考虑 oss 其实成本应该比磁盘贵 书少确实存数据库, 但是海量的书存数据库就不合适宜了, 主要是数据库的存储太贵了
什么需求需要存数据库呢?数据库存元数据(名字大小目录之类的),本地盘存实际文本会不会好些
好巧 我的小说文章网(只是一个工具的部分功能)也正在收录,刚发布完。资源来源 pdd 的几十块的 U 盘,大部分格式是 pdf 的,其他是 txt 等,偷个懒我直接传诚通网盘了,直接下载。要兼容这么多格式,工作量太繁琐。3 天时间一口气发布了 4w 多篇文章。 li2345.com/read
暂时没有分布式要求,单机网络开销多大? 现在网络已经存在性能瓶颈了吗?
我还真做过,我的做法是一本小说压缩后分章节存入 sqlite 。这里有几个原因,第一是可以让细碎的章节文件合并起来,还有是查 sqlite 要比直接从文件系统读取更快,以及当用户阅读一本书的时候,应该是连续的,要把后续章节提前拉到本地做缓存,而不是只把当前章节拉到本地做缓存。当时我抓了压缩后接近一个 T 的小说数据。
sqlite 文件放在 OSS 上进行保存。本地做一个缓存机制,100GB 硬盘可以缓存几万本书,对于小站点来说完全够了。普通的 CC 攻击打不死。
小说网站感觉基本 99%的小说都是在吃灰状态。oss+本地热缓。oss 主要节约时间来着
磁盘存文件,meta 存 mongo ,字段包括书名作者概要及文件路径等等。关键 meta 元素的提取怎么来。如果全文检索只能都进数据库了吧。没用过 oss ,认知范围内只会这样。
成熟方案参考杰奇小说元数据 mysql 小说 txt 扔硬盘生成纯静态 html热文件扔 ssd 什么压力都没有
oss 确实不失是一个好方法,但是在集中密集操作就暴露缺点了,如果我要读完整的一本书的内容, 网络开销太大了 还有就是如果是免费小说那么静态化再加上 CDN 毫无压力, 可是如果是收费呢? 总结: 把磁盘和 oss 的优点集中起来, 既存 oss 又存磁盘, 有没有就好很多 ……^_^ 不存数据库的话全文检索又是一个问题。
如果没有全文检索需求的话可以压缩存储,web 场景下 cpu 资源很多都是被浪费了(常年在 20%以下),可以通过压缩利用起来
能详细说说怎么存的吗,一本小说一个 sqlite 文件 还是 1T 数据全是同一个 sqlite 文件 或者时按照其他规则拆分的? 压缩算法用的时 zip 吗? 我之前有尝试用 zip 算法压缩文本 然后存入 sqlite 体积只有原来的四分之一
如果预算够,直接上 oss ,如果做磁盘存储的话,备份是一个很大的问题。小说文件都是小文本,小文件备份效率非常低。oss 除了费钱以外,其他都挺好的。oss+cdn ,基本上不用这么管。
OSS 应对密集操作不友好,网络 IO 太高
#17 全是一个 SQLite 文件,应该也没啥不妥吧。。我在隔壁帖,测试了单表 1.3 亿 100 GB 数据,六七年前轻薄本上,还能上万随机读/写事务并发。。压缩存储,感觉用 zstd 较好?压缩率接近 lzma ,但解压速度快 7 倍。。可以测试一下,每 N 个章节一起压缩后总大小 S0 ,与整本小说压缩后大小 S1 ,的关系。选 N 尽量小(只读取一章时,不用浪费太多力气解压更多章节),S0 又尽可能逼近 S1 的( N 太小,会浪费很多空间,反复存储词典啥的?导致 S0 远大于 S1 。。)或者试试,行级别的 zstd 压缩插件( github.com/phiresky/sqlite-zstd ),或者页级别的( github.com/mlin/sqlite_zstd_vfs ),或者官方 $4000 的( sqlite.org/purchase/zipvfs )对了,中文内容的话,换成 UTF-16 存储,能直接省 1/3 空间。。
相比磁盘存储,为嘛不选 SQLite 数据库呢?感觉优点还行呀:1. 单表 1.3 亿 100 GB 大小时,六七年前轻薄本上,仍能上万随机读/写事务并发。且只占用 16 MB 内存。源码在隔壁帖2. 官方宣称,相比文件系统,10 KB 文件存数据库里,能快 35%,节省 20% 空间。文章你按章节来存的话,假设每章 5000 汉字,UTF-16 存,恰好 10 KB 。3. 支持全文索引,甚至拼音/首字母/多音字。可无限搜索事务同时进行。微信宣称,手机端百万百字聊天记录,搜三字词,只需 0.0029 秒。10 秒全文索引完毕。文章4. 备份迁移时,没有天量小文件烦恼。两周后,SQLite 会发布一个,远程增量同步工具。
#10 #17我用近 14000 章的《带着农场混异界》,试了一下 zstd 的预训练词典,感觉很适合分章节压缩存储,因为 UTF-8 时,整本压缩率 20%,分章节总压缩率也才 22% ~ 28%,还能快速随机选取章节。如果独立压缩章节,总压缩率飙到 38%。1. 压缩后,UTF-16 没有明显优势。所以采取 UTF-8 就好。UTF-8 时 137.4 MB- gzip 压缩 43.5 MB ( 31.7%)- zstd 压缩 28.7 MB ( 20.9%)- lzma 压缩 26.8 MB ( 19.5%)UTF-16 时 96.9 MB ,- gzip 压缩 39.0 MB (少 10.5%,相比 UTF-8 压缩后)- zstd 压缩 27.6 MB (少 3.9%)- lzma 压缩 25.2 MB (少 6.2%)2. 分章节后,所有压缩算法表现都很差。可选择多章节压缩,或分离词典。- gzip 后共 55.6 MB ( 40.5%)- zstd 后共 51.8 MB ( 37.7%)- lzma 后共 52.4 MB ( 38.2 %)3. 只有 zstd 支持预训练词典,且不同词典大小,分章节总压缩率也不同。- 32 KB 词典(压缩后 12.6 KB ),压缩后+词典 39.6 MB ( 28.8%)- 64 KB 词典(压缩后 24.7 KB ),压缩后+词典 37.8 MB ( 27.5%)- 110 KB 词典(压缩后 41.9 KB ),压缩后+词典 36.6 MB ( 26.7%)← 默认词典大小- 128 KB 词典(压缩后 48.7 KB ),压缩后+词典 36.3 MB ( 26.4%)- 256 KB 词典(压缩后 97.8 KB ),压缩后+词典 35.0 MB ( 25.5%)- 512 KB 词典(压缩后 197.2 KB ),压缩后+词典 34.1 MB ( 24.8%)- 1024 KB 词典(压缩后 315.3 KB ),压缩后+词典 33.0 MB ( 24%)- 2048 KB 词典(压缩后 611.2 KB ),压缩后+词典 32.1 MB ( 23.3%)- 4096 KB 词典(压缩后 1164.8 KB ),压缩后+词典 31.2 MB ( 22.7%)- 8192 KB 词典(压缩后 2328.5 KB ),压缩后+词典 32.4 MB ( 23.6%)4. 个人认为,不同场景的选择。- 如果本地收藏,追求极致压缩,每次查看,接受解压全本,应该选 UTF-16 + lzma ,压缩率 18%- 如果本地收藏,但要求快速任意跳转章节,选 UTF-8 + zstd + 大词典,压缩率 23%- 如果对外提供服务,选 UTF-8 + zstd + 小词典,压缩率 27%第三点考虑如下:- 若服务器本地解压,再传给用户,每次选取章节后,再取对应词典压力较小,缓存词典所需内存也少- 若要求客户端先拿词典,再本地解压呈现章节。面对只看几章就弃书的用户,沉没成本较低( 20 ~ 40 KB )
问一下 压缩后的数据存 text 类型还是 blob 类型?
#23BLOB ,存的是 zstd 压缩后的二进制数据。噢,如果要全文搜索,存压缩后数据也没关系的。SQLite 的 FTS 支持无内容表,只要你添加/删除时,提供了压缩前的章节内容,就行。但搜索结果只有 章节 ID
,还需要回 章节表
取数据解压。但搜索服务,一般都会分页呈现结果,所以不会一下子解压几万个章节出来。。一下子解压几万个章节。。可能也没事?过亿数据,都能四五万随机读并发,命令行里 zstd 用词典,单线程解压那 14000 章节文件,也才 0.9 秒。。还是六七年前的轻薄本了。。
最近想买一台 Nothing CMF phone 1 代,这是以前的一加联合创始人做的新手机品牌。我就去 YouTube 看评测,系统干净,后壳漂亮克制很有设计感,有点像当年锤…
现阶段 Windows 系统 在桌面市场的占有率大约在 62.65% 左右,除去 未激活用户、企业使用家庭版用户、批量 激活用户等用户,Windows 在全球范围内的正版率应该…
想用线路优化机反代大内存机,都是些自己 Docker 的小工具,emby 、miniflux 、哪吒面板之类的。 都是使用的 Nginx Proxy Manager ,原网站一…