因为要读取从大众点评爬下来的一些数据,所以在文件有点大的情况下就造成jupyter notebook在读取的时候直接卡死,出现memory error的情况。
那么如何解决这样的问题呢?掌柜经过一番探索,终于找到解决的办法,先写上解决的代码:
with open('你要读取的文件', 'r',encoding='utf-8') as f:
for line in f:
res = line
print(res)
然后可以查看总耗时是33秒:
别小看这么两行简单的代码,里面蕴含的玄机还是值得思考的。于是掌柜在思考之后,总结了一下关于用Python读取本地较大型文件的各种方法:
- 第一种就是直接读取,使用read()方法,可以看下面的示例代码:
file = '你要读取的文件'
f = open(file,'r',encoding='utf-8')
res = f.read()
print(res)
f.close()
这种方式的好处:直接一次读取文件内容;
但是坏处:
- 一旦文件过大,就会出现memory out(即内存泄漏),然后出现像上面掌柜说的jupyter notebook立马就会卡死的情况;
- 其次,文件读取结束后需要手动写上f.close()才会关闭文件,释放系统内存。
- 第二种方式按行读取,这里分两种情况,如果只读取一行的话,用readline()方法,依然以上面的示例代码来看:
file = '你要读取的文件'
f = open(file,'r',encoding='utf-8')
res = f.readline()
print(res)
f.close()
如果一次逐行读取整个文件,即多行读取的话,使用readlines()方法,就这样写:
file = '你要读取的文件'
f = open(file,'r',encoding='utf-8')
for line in f.readlines():
res = line
print(res)
f.close()
这种其实跟第一种比较类似,区别就是read()是返回的字符串或字节对象,而readlines会返回一个list,且list会直接保存在内存上。所以坏处也和第一种一样,一旦过大就发生内存泄漏!!!
那么有没有更好的方法可以即能逐行读取整个文件,还不会造成内存泄漏呢?
当然有,我们翻看Python的官方文档可以发现,
- 它就是接下来我们要介绍的第三种方法(也就是文章一开始的方法),更“Pythonic”的方法,还是上面的例子,但是代码可以这么写:
with open('你要读取的文件', 'r',encoding='utf-8') as f:
for line in f:
res = line
print(res)
现在根据官方文档来解释一下上面这段代码具体好在哪里!
首先使用with语句的好处 :
(1). 可以在你读写文件结束后自动关闭文件,释放内存,不用再麻烦的写上f.close();
(2). 使用with的话,它会比你使用等价的try-finally 模块速度更快。
而使用for line in f 的方法好处在于 能更高效、快速的读取文件而不引发内存泄漏问题。
PS: 也许你还有疑问,为什么读完文件要写上关闭文件的这一步?
这里再根据官方文档解释一下,有两点原因:
第一:如果你没有明确的告诉Python关闭该文件,那么Python的垃圾回收器就会去毁坏这个文件并关闭这个打开的文件,但是这个文件可能还是会保持一段打开的状态;
第二:不同的Python实现(这里是指Python有很多实现。CPython是最通用的,它是一个用C实现的,被认为是”默认“的实现。还有其他的实现,例如IronPython、Jython 、PyPy、MicroPython等,具体的信息可以参考Python官网。)将会在不同的时间进行清理垃圾,即使后面你用with语句或调用f.close()来关闭了这个文件,但是当你还要再次使用这个文件对象的时候,就会报错如下:
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file.
所以经过这个读取文件小小的事情可以看出来,Python语言虽然简单,但是其中的一些细节处理却还是值得我们注意的!!!
最后谢谢阅读,如果有问题,请指出纠正😁。
因为要读取从大众点评爬下来的一些数据,所以在文件有点大的情况下就造成jupyter notebook在读取的时候直接卡死,出现memory error的情况。那么如何解决这样的问题呢?掌柜经过一番探索,终于找到解决的办法,先写上解决的代码:with open('你要读取的文件', 'r',encoding='utf-8') as f: for line in f: re...
Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解
这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件。
1. read() 接口的问题
f = open(filename, 'rb')
f.read()
我们来读取 1 个 nginx 的日至文件,规模为 3Gb 大小。read() 方法执行的操作,是一次性全部读入内存,显然会造成:
MemoryError
也即会发生内存溢出。
2. 解决方案:转换接口
(1)readlines() :读取全部的行,构成一个 list
背景:在做nlp任务前期,尝试各种常用baseline方法的效果,然后用fix_transform加载数据时,报错MemoryError。请教了相关同事以及网上的解决方案,查到了最根本的方法:换个内存大的机器,然而我的瓶颈就是没有机器~
所以从自己的特征入手,改变原来的特征拼接方法,用内积、累加等方式尝试,结果。。。
所以决定从更上层来尝试——减少提取特征时的维度:
1.将在样本层做处理,将多个文...
MemoryError:涉及到了读取、保存、写入,内存不够用了
解决方法:
检查安装64位python,64位python内的pandas和Numpy都是64位,内存更大。
如果在虚拟机中运行:设置虚拟机内存大小即可(我使用的这种方法)
再次运行,不再报错:
最近刚刚学习Python,用的软件是PyCharm。在手打了一个基于物品的推荐算法,并且跑一个20000+的数据集时,出现了Memory Error错误。一开始以为是代码问题,后面才发现自己的内存已经到达了80%+了。查阅相关资料,这个大哥写的很不错,大家可以去看看。
l解决Python memory error的问题(四种解决方案).
这是我自己出现的问题
我分析了一下出现这个错误的原因:
1....
最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法。
我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法...
python处理大训练集过程中经常会遇到的
Memory Error问题
这里看了几位博主的解决方案进行了整理,感谢分享!
http://chenqx.github.io/2014/10/29/
Python-fastest-way-to-read-a-large-file/
https://blog.csdn.net/weixin_39750084/article/details/81501395
感谢大佬:python处理大训练集过程中经常会遇到的Memory Error问题
【亲测有效】扩大虚拟内存的方法(我的系统是win10,不过应该都大同小异):
1、打开 控制面板;
2、找到 系统 这一项;
3、找到 高级系统设置 这一项;
4、点击 性能 模块的 设置 按钮;
5、选择 高级面板,在 虚拟内存 模块点击更改;
6、记得 不要 选中“自动管理所有驱动器的分页文件大小”,然后选择一个驱动器(也可把每个驱动器都设置一遍~),也就是一个盘,选中自定义大小,手动输入初始大小和最大值,当然,最好不要太