如果我们有一个大文件,有一种技术用块读取和处理它。
假设我在请求中收到了一个文件(因为我看到它是InMemoryFile对象),并且想要读取它的内容。如果我使用read()一次性读取它会有什么危害,或者最好用块读取它?
更新:
我不清楚的事情是:如果我们得到一个请求(带有内存对象),这是不是意味着该文件已经在内存中了?我看不到它可以存储的任何其他地方。如果它已经在内存中,那么.read()正在改变什么?
答案 0 :(得分:0)
Django在上传文件时总是为您提供类似的文件。如果文件不是太大,它会为你提供一个内存中的对象,如果 太大,它将首先流式传输到磁盘。
请参阅Where uploaded data is stored:
默认情况下,如果上传的文件小于2.5兆字节,Django会将上传的全部内容保存在内存中。这意味着保存文件只涉及从内存中读取和写入磁盘,因此非常快。
通过始终为您提供类似文件的对象,您不必将代码调整为特殊情况下的内存中变体,但是您不必遭受性能损失,更大的文件必须受到影响从磁盘读取。
对于内存中的文件对象,.chunks()
method将只返回整个文件内容。对于较大的文件,您将获得一系列小到足以进行有效处理的块。
如果您没有对字符串执行任何其他操作,则从内存中的文件对象读取实际上不会创建新字符串;因为字符串是不可变的,所以可以安全地共享它。