因为要读取从大众点评爬下来的一些数据,所以在文件有点大的情况下就造成jupyter notebook在读取的时候直接卡死,出现memory error的情况。

那么如何解决这样的问题呢?掌柜经过一番探索,终于找到解决的办法,先写上解决的代码:

with open('你要读取的文件', 'r',encoding='utf-8') as f:
    for line in f:
        res = line
        print(res)

然后可以查看总耗时是33秒:
在这里插入图片描述
别小看这么两行简单的代码,里面蕴含的玄机还是值得思考的。于是掌柜在思考之后,总结了一下关于用Python读取本地较大型文件的各种方法

  • 第一种就是直接读取,使用read()方法,可以看下面的示例代码:
file = '你要读取的文件'
#这里表示用utf-8来编码文件内容
f = open(file,'r',encoding='utf-8')
res = f.read()
print(res)
f.close()

这种方式的好处:直接一次读取文件内容;
但是坏处

  1. 一旦文件过大,就会出现memory out(即内存泄漏),然后出现像上面掌柜说的jupyter notebook立马就会卡死的情况;
  2. 其次,文件读取结束后需要手动写上f.close()才会关闭文件,释放系统内存。
  • 第二种方式按行读取,这里分两种情况,如果只读取一行的话,用readline()方法,依然以上面的示例代码来看:
file = '你要读取的文件'
#这里表示用utf-8来编码文件内容
f = open(file,'r',encoding='utf-8')
res = f.readline()
print(res)
f.close()

如果一次逐行读取整个文件,即多行读取的话,使用readlines()方法,就这样写:

file = '你要读取的文件'
#这里表示用utf-8来编码文件内容
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、记得 不要 选中“自动管理所有驱动器的分页文件大小”,然后选择一个驱动器(也可把每个驱动器都设置一遍~),也就是一个盘,选中自定义大小,手动输入初始大小和最大值,当然,最好不要太
1、打开pycharm安装目录D:\PyCharm Community Edition 2019.2\bin,找到pycharm.exe.vmoptions文件,编辑 源文件: -Xms128m -Xmx768m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:CICompilerCount=2 -Dsun.io.useCanonPrefixCache=false 如何解决报错ValueError: Input contains NaN, infinity or a value too large for dtype('float64')的问题 52134 Jupyter notebook读取大型csv文件遇到The kernel appears to have died. It will restart automatically的错误原因排查 WZFG2544717973: 作者您好!我最近也遇到和您一样的问题,我用jupyter读取json文件时(文件大小为10多个G),提示内核挂掉,这个怎么解决? 利用SARIMA模型对季节周期性的时序案例进行分析(一) lv1415: 楼主,想请教个问题,就是用dynamic = True再次验证出来的结果效果非常差,是一条波动很小的曲线,这样的话算是验证失败了,应该怎么去做 如何根据自相关(ACF)图和偏自相关(PACF)图选择ARIMA模型的p、q值 学习之路坎坷亦是有趣: 文中提到的标准差是指什么数据的标准差呀