请问静态资源取走后删除怎么做性能最高,代码最简洁呢

2020-06-29 20:18:58 +08:00
 Te11UA

首先说一下是 Python 技术栈,现在需求是有大量的文件不断生成在一个目录下(文件几 k 到几百 k 不等,同期数量约 20W ),想做一个服务,使得其它服务来请求的时候能快速地取走该文件,并在取走后删除。

当然,最简单的做法就是 Tornado/Flask 直接写个接口,然后 os.remove 就行,想问下大伙儿还有什么高效率的方法来实现吗?

4331 次点击
所在节点    Python
38 条回复
gwy15
2020-06-29 20:27:02 +08:00
zero-copy (sendfile)?
ipwx
2020-06-29 20:31:48 +08:00
redis
optional
2020-06-29 20:49:25 +08:00
这样性能并不高啊,包括生成大量文件与删除。
删除是强需求吗,是一定只能取一次,还是过一段时间取不到就好?
chenqh
2020-06-29 20:55:04 +08:00
流程没懂
Te11UA
2020-06-29 20:56:41 +08:00
@optional 删除是强需求,但不要求立即删。正是性能不高才想问问呢
@gwy15 学习了,我试试~
@ipwx 不太清楚怎么做会好点儿,能再具体说说不?
Te11UA
2020-06-29 20:57:43 +08:00
@chenqh 提供一个接口,让其它的服务来取该目录下的文件,取完文件后删除。删除不要求即时
optional
2020-06-29 21:26:42 +08:00
@Te11UA 不要求立即删除,就放不同文件夹,比如每个小时一个文件夹,然后定时半小时删除之前的文件夹就好了。
Te11UA
2020-06-29 21:48:17 +08:00
@optional 不可以,未取走的不能被删除:(
jugelizi
2020-06-29 22:01:07 +08:00
效率?嫌删除动作慢?改成异步任务呗
vevlins
2020-06-29 22:07:35 +08:00
不删除直接覆盖写?瞎说一下
netnr
2020-06-29 22:15:11 +08:00
重命名文件夹,mv folder folder.del
再删除 *.del 文件夹
makdon
2020-06-29 22:56:02 +08:00
要不换成 SSD ?如果是自己的物理服务器,可以搞 nvme 的,或者组个 raid,应该会更快
等等首先现在你的瓶颈在哪里...是定位到了线程池里面大部分线程都在等 os.remove 吗(个人感觉应该是读文件的成本远远高于删文件吧)
如果不是的话...不要提前优化

我想到的这些:
1. 如果业务上面可以实现的话,在请求到的时候再生成文件,不落硬盘直接发送
2. 按照文件名之类的唯一键,hash 到多台服务器上面处理
3. 只能单机的话,可以调研一下有没有适合这个场景的文件系统...
billlee
2020-06-30 00:52:59 +08:00
别想太多,才 20 万文件而已,只要你不去遍历目录,现代文件系统处理起来不会有问题
realpg
2020-06-30 01:10:47 +08:00
想要高性能,直接写个简单的文件系统。
计算机科班专业的大佬应该都会,如果上学时候做过相关的作业,估计两三天就能解决这个问题。
发生一次读取内容之后直接标记这个文件的区域释放。
realpg
2020-06-30 01:16:20 +08:00
而且 20 万这个级别,一个文件不超过 1MB,这种存储的 IOPS 只要高一点,连瓶颈都不会发生啊……
文件系统只要是个稍微现代点的文件系统即可。
不知道你那边用的啥服务器,基础架构层优化一下就完事了。

如果基础架构层没法优化,还想绕开删除慢这个坑,那就用完的改名,加前缀,然后当系统 io 不密集时进行限定写负载的删除
Vegetable
2020-06-30 01:34:39 +08:00
文件需要鉴权?一定要 python 来处理文件?有点蛇。其实直接 remove 并没有什么性能问题,同步 web 框架控制好流程就行,性能瓶颈不在删除这里。异步的话可以用 redis 之类的把取走的文件标记一下,定时删除就好了。
0ZXYDDu796nVCFxq
2020-06-30 01:38:07 +08:00
nginx 提供静态访问,瓶颈就是网络带宽
访问记录输出日志,Python 定时读取日志批量删除
SlipStupig
2020-06-30 02:05:34 +08:00
Redis 直接使用队列就好了啊。。
hurrytospring
2020-06-30 02:24:52 +08:00
不要求立即删的话搞个表标记一下删除就行了。。真正删除的时候再搞个定时任务拉表批量删掉完事
jedihy
2020-06-30 04:03:53 +08:00
@gwy15 zerocopy 可以删除?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX