Python InMemoryPloadedfile真的是这样吗;在内存中;?

Python InMemoryPloadedfile真的是这样吗;在内存中;?,python,django,memory-management,Python,Django,Memory Management,我知道打开一个文件只会创建一个文件处理程序,它会占用固定内存,而不管文件大小如何。 Django有一个名为InMemoryUploadedFile的类型,它表示通过表单上传的文件 我在django视图中获得文件对象的句柄,如下所示: file_object = request.FILES["uploadedfile"] 此文件\u对象在MemoryUploadedFile中具有类型 现在我们可以亲眼看到,file_对象具有方法.read(),用于将文件读入内存 bytes = file_obj

我知道打开一个文件只会创建一个文件处理程序,它会占用固定内存,而不管文件大小如何。 Django有一个名为
InMemoryUploadedFile
的类型,它表示通过表单上传的文件

我在django视图中获得文件对象的句柄,如下所示:

file_object = request.FILES["uploadedfile"]
此文件\u对象在MemoryUploadedFile中具有类型

现在我们可以亲眼看到,file_对象具有方法
.read()
,用于将文件读入内存

bytes = file_object.read()

不是< <代码> >内存中的文件> <代码> >“内存中”>

< P>一件事要考虑的是,在Python文件中,像对象有一个非常严格遵守的API。这使得代码非常灵活,它们是I/O流上的抽象。这些允许您的代码不必担心数据来自何处,即内存、文件系统、网络等

对象通常定义一对,其中一个是
read

我不确定
InMemoryUploadedFile
的实际实现,也不确定它们是如何生成的或存储在哪里的(我假设它们完全在内存中),但您可以放心,它们是类似文件的对象,并且包含
读取
方法,因为它们遵循文件api

对于实现,您可以开始签出源:

文件对象上的
read()
方法是从文件对象中访问内容的方法,而不管该文件是在内存中还是存储在磁盘上。它类似于其他实用程序文件访问方法,如
readlines
seek

该行为类似于Python,而Python又是通过操作系统的
fread()
方法构建的

从文件中读取最大大小的字节(如果读取达到EOF,则会减少 在获取大小字节之前)。如果size参数为负或 省略,读取所有数据直到达到EOF。字节返回为 字符串对象。遇到EOF时返回空字符串 马上。(对于某些文件,如TTY,继续是有意义的 请注意,此方法可能会调用 在努力获取的过程中多次使用底层C函数fread() 尽可能接近字节大小。还请注意,在 非阻塞模式下,返回的数据可能少于请求的数据,甚至 如果没有给出尺寸参数

关于MemoryUploadedFile
中的
究竟存储在何处的问题,这是一个非常重要的问题

在保存上载的文件之前,需要将数据存储在某个位置

默认情况下,如果上载的文件小于2.5 MB,则Django 将上载的全部内容保存在内存中。这意味着 保存文件只需要从内存读取和写入磁盘 因此速度非常快

但是,如果上载的文件太大,Django将编写 已上载文件到存储在系统临时文件夹中的临时文件 目录在类Unix平台上,这意味着您可以期望Django 生成一个名为/tmp/tmpzfp6I6.upload的文件。如果 上载足够大,您可以看到此文件随着Django的增长而增大 将数据流到磁盘上

这些细节–2.5兆字节/tmp;等等——都是“合理的” 违约”。请继续阅读,了解有关如何自定义或完全自定义的详细信息 替换上载行为


可以被视为类似文件的对象接口(或)。好的,我现在知道
InMemoryUploadedFile
是类似文件的对象,但它是存储在内存中还是磁盘上?这个问题很重要,因为它限制了用户上传的大小,一个内存很小的服务器可以处理。+1是一个很好的答案,但不能准确回答我的问题。
InMemoryUploadedFile
是否必须存储在内存中或存储在磁盘上?是否已更新我的答案2.5 Mb实际上在内存中,否则它是磁盘上的临时文件。默认值可以在设置中更改,并有其限制。