Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,解析30MB文件时出现内存错误(已下载到本地计算机)_Python_File Io - Fatal编程技术网

Python,解析30MB文件时出现内存错误(已下载到本地计算机)

Python,解析30MB文件时出现内存错误(已下载到本地计算机),python,file-io,Python,File Io,这是我的下载地址,文件名是“kosarak” http://fimi.uantwerpen.be/data/ 我的解析代码是: parsedDat = [line.split() for line in open('kosarak.dat').readlines()] 我需要将这些数据作为一个整体来运行一些方法,所以逐行读取并在每一行上执行操作在这里不适合我 这个文件只有30MB,我的电脑至少还有10G内存和30+G硬盘,所以我想应该不会有任何资源问题 仅供参考:我的python版本是2.7

这是我的下载地址,文件名是“kosarak”

http://fimi.uantwerpen.be/data/
我的解析代码是:

parsedDat = [line.split() for line in open('kosarak.dat').readlines()]
我需要将这些数据作为一个整体来运行一些方法,所以逐行读取并在每一行上执行操作在这里不适合我

这个文件只有30MB,我的电脑至少还有10G内存和30+G硬盘,所以我想应该不会有任何资源问题

仅供参考:我的python版本是2.7,我正在Spyder内部运行python。我的操作系统是Windows10

PS:您不需要使用我的解析代码/方法来完成这项工作,只要您可以将数据从文件中获取到我的python环境,这将是完美的。

也许这会有所帮助

with open('kosarak.dat', 'r') as f:  # Or 'rb' for binary data.
    parsed_data = [line.split() for line in f]
不同之处在于,您的方法一次读取文件中的所有行,然后处理每一行(实际上需要2倍的内存,一次用于文件数据,另一次用于解析数据,所有这些数据必须同时存储在内存中),然而,这种方法只是逐行读取文件,并且只需要为生成的
解析的_数据
提供内存

此外,您的方法没有显式关闭该文件(尽管您可能只是没有显示代码的该部分)。此方法使用上下文管理器(
with expression[as variable]:
),它将在
with
块终止后自动关闭对象,即使出现错误。请参阅。

也许这会有所帮助

with open('kosarak.dat', 'r') as f:  # Or 'rb' for binary data.
    parsed_data = [line.split() for line in f]
不同之处在于,您的方法一次读取文件中的所有行,然后处理每一行(实际上需要2倍的内存,一次用于文件数据,另一次用于解析数据,所有这些数据必须同时存储在内存中),然而,这种方法只是逐行读取文件,并且只需要为生成的
解析的_数据
提供内存


此外,您的方法没有显式关闭该文件(尽管您可能只是没有显示代码的该部分)。此方法使用上下文管理器(
with expression[as variable]:
),它将在
with
块终止后自动关闭对象,即使出现错误。请参阅。

每个进程都分配了一些内存,以便执行其操作,如果它使用的内存超过这些,则会出现内存错误。整个RAM与此无关。您的系统是Windows还是Linux?这是你和Spyder一起做的。Spyder使用的内存也将出现在图片中。请查看一些每次处理一块大数据文件的方法-这可能是您的解决方案problem@PeptideWitch好的,我来看看这个问题,看看一些答案是否适用于meAre你确定你安装了64位版本的Python吗?如果您运行的是32位版本的Python(用户虚拟地址空间限制为2GB,Spyder可能会严重破坏它),10GB的内存对您没有多大帮助。此外,通过删除
.readlines()
,您可以(大致)将峰值内存使用量减半;file对象本身(惰性地)是可移植的,调用
.readlines()
会迫使它急切地将整个文件读入内存,只会迭代它,然后扔掉它。也可以懒散地迭代,只存储分割行,而不是同时存储分割行和原始行。请注意,读取一个30 MB的文件本身不应该是问题,即使您将整个过程弄糟并存储两个数据的碎片副本,但如果Spyder在其自己的进程中运行您的脚本,而且它本身是一个32位的进程,内存使用非常有意义,您的脚本可能只是压垮骆驼的一根稻草。每个进程都分配了一些内存来执行其操作,如果它使用的内存超过这个值,则会出现内存错误。整个RAM与此无关。您的系统是Windows还是Linux?这是你和Spyder一起做的。Spyder使用的内存也将出现在图片中。请查看一些每次处理一块大数据文件的方法-这可能是您的解决方案problem@PeptideWitch好的,我来看看这个问题,看看一些答案是否适用于meAre你确定你安装了64位版本的Python吗?如果您运行的是32位版本的Python(用户虚拟地址空间限制为2GB,Spyder可能会严重破坏它),10GB的内存对您没有多大帮助。此外,通过删除
.readlines()
,您可以(大致)将峰值内存使用量减半;file对象本身(惰性地)是可移植的,调用
.readlines()
会迫使它急切地将整个文件读入内存,只会迭代它,然后扔掉它。也可以懒散地迭代,只存储分割行,而不是同时存储分割行和原始行。请注意,读取一个30 MB的文件本身不应该是问题,即使您将整个过程弄糟并存储两个数据的碎片副本,但如果Spyder在其自己的进程中运行您的脚本,而且它本身就是一个32位的进程,内存使用非常有意义,你的脚本可能只是压垮骆驼背的稻草。我想你忘了实际循环了<代码>对于f中的行:已解析的_data.append(line.split())在任何情况下都比手动调用
.readline()
更高效、更通俗,同时仍然坚持延迟迭代。或者只是保持列表理解,
parsed_data=[line.split()表示f中的行]
谢谢!但这只给了我一行数据,我不知道为什么,但在f:parsed_data.append(line.split())中用open('kosarak.dat','r')作为f:for行对我的case@cloudscomputes如上所述,就内存而言,逐行读取文件、边处理数据要高效得多(尽管它可能比
.readlines()
)慢。您甚至可以将处理后的数据输出到一个辅助文件,该文件随后将执行vi