InMemoryUploadedFile真的“在内存中”吗?

时间:2013-12-29 17:20:08

标签: python django memory-management

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

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

file_object = request.FILES["uploadedfile"]

此file_object的类型为InMemoryUploadedFile

现在我们可以看到,file_object有方法.read(),用于将文件读入内存。

bytes = file_object.read()

内存中是否已经存在类型为InMemoryUploadedFile file_object ?“

2 个答案:

答案 0 :(得分:8)

文件对象上的read()方法是从文件对象中访问内容的方式,无论该文件是在内存中还是存储在磁盘上。它类似于readlinesseek等其他实用程序文件访问方法。

行为类似于built into Python,而后者又是基于操作系统的fread()方法构建的。

  

从文件中读取最多大小字节(如果读取命中EOF,则更少)   在获得大小字节之前)。如果size参数为负数或   省略,读取所有数据,直到达到EOF。字节返回为   一个字符串对象。遇到EOF时返回空字符串   立即。 (对于某些文件,比如ttys,继续是有意义的   在EOF被击中后读取。)注意这种方法可以调用   潜在的C函数fread()不止一次努力获取   尽可能接近大小字节。还要注意,在   非阻塞模式,甚至可以返回比请求的数据少的数据   如果没有给出尺寸参数。

关于InMemoryUploadedFile的确切位置问题,它是bit more complicated

  

在保存上传的文件之前,需要将数据存储在某处。

     

默认情况下,如果上传的文件小于2.5兆字节,则为Django   将上传的全部内容保存在内存中。这意味着   保存文件只涉及从内存中读取和写入磁盘   因此非常快。

     

但是,如果上传的文件太大,Django会写   将文件上传到存储在系统临时文件中的临时文件   目录。在类似Unix的平台上,这意味着你可以期待Django   生成一个名为/tmp/tmpzfp6I6.upload的文件。如果   上传足够大,你可以看到这个文件的大小增长为Django   将数据流式传输到磁盘上。

     

这些细节 - 2.5兆字节;的/ tmp;等 - 简单地“合理   默认值”。请继续阅读有关如何自定义或完全自定义的详细信息   替换上传行为。

答案 1 :(得分:2)

要考虑的一件事是,在python文件中,对象具有非常严格遵守的API。这允许代码非常灵活,它们是I / O流的抽象。这些允许您的代码不必担心数据的来源,即。内存,文件系统,网络等。

File like个对象通常会定义一对methods,其中一个是read

我不确定InMemoryUploadedFile的实际实现,或它们是如何生成的或它们的存储位置(我假设它们完全在内存中),但你可以放心它们就像文件一样对象并包含read方法,因为它们遵循文件api。

对于实施,您可以开始检查来源: