Pra*_*tal 8 python django memory-management
我知道打开一个文件只会创建一个文件处理程序,它接受一个固定的内存,而不管文件的大小.Django有一个类型InMemoryUploadedFile,表示通过表单上传的文件.
我在django视图中获取了我的文件对象的句柄,如下所示:
file_object = request.FILES["uploadedfile"]
Run Code Online (Sandbox Code Playgroud)
这个file_object有类型InMemoryUploadedFile.
现在我们可以看到,file_object具有.read()用于将文件读入内存的方法.
bytes = file_object.read()
Run Code Online (Sandbox Code Playgroud)
类型的file_object是否InMemoryUploadedFile已经"在内存中"?
read()文件对象上的方法是从文件对象内访问内容的方式,而不管该文件是在内存中还是存储在磁盘上.它类似于其他实用程序文件的访问方法,如readlines或seek.
这种行为类似于Python 内置的行为,后者又是基于操作系统的fread()方法构建的.
从文件中读取最多大小字节(如果读取在获取大小字节之前达到EOF,则更少).如果size参数为负数或省略,则读取所有数据,直到达到EOF.字节作为字符串对象返回.立即遇到EOF时返回空字符串.(对于某些文件,如ttys,在EOF被命中后继续读取是有意义的.)注意,此方法可能多次调用底层C函数fread(),以尽可能接近大小字节.另请注意,在非阻塞模式下,即使未给出大小参数,也可能返回的数据少于请求的数据.
关于InMemoryUploadedFile存储的确切位置的问题,它有点复杂.
在保存上传的文件之前,需要将数据存储在某处.
默认情况下,如果上传的文件小于2.5兆字节,Django会将上传的全部内容保存在内存中.这意味着保存文件只涉及从内存中读取和写入磁盘,因此非常快.
但是,如果上传的文件太大,Django会将上传的文件写入存储在系统临时目录中的临时文件中.在类似Unix的平台上,这意味着你可以期待Django生成一个名为/tmp/tmpzfp6I6.upload的文件.如果上传足够大,您可以观看此文件的大小增长,因为Django将数据流式传输到磁盘上.
这些细节 - 2.5兆字节; 的/ tmp; 等 - 只是"合理的默认值".请继续阅读,了解有关如何自定义或完全替换上载行为的详细信息.
| 归档时间: |
|
| 查看次数: |
5605 次 |
| 最近记录: |