Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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 读取大的CSV并后跟“.iloc”切片列时会出现内存错误_Python_Pandas_Csv_Memory_File Io - Fatal编程技术网

Python 读取大的CSV并后跟“.iloc”切片列时会出现内存错误

Python 读取大的CSV并后跟“.iloc”切片列时会出现内存错误,python,pandas,csv,memory,file-io,Python,Pandas,Csv,Memory,File Io,我一直试图用Pandas处理一个1.4GB的CSV文件,但内存一直有问题。我尝试了不同的方法,试图让Pandasread\u csv无效 当我使用iterator=True和chunksize=number参数时,它不起作用。此外,chunksize越小,处理相同数量数据的速度就越慢。 (简单的高开销并不能解释这一点,因为当块的数量很大时,它的速度太慢了。我怀疑在处理每个块时,panda需要遍历它之前的所有块来“找到它”,而不是直接跳到块的开始。这似乎是唯一可以解释这一点的方法。) 最后,

我一直试图用Pandas处理一个1.4GB的CSV文件,但内存一直有问题。我尝试了不同的方法,试图让Pandas
read\u csv
无效

  • 当我使用
    iterator=True
    chunksize=number
    参数时,它不起作用。此外,
    chunksize
    越小,处理相同数量数据的速度就越慢。
    • (简单的高开销并不能解释这一点,因为当块的数量很大时,它的速度太慢了。我怀疑在处理每个块时,panda需要遍历它之前的所有块来“找到它”,而不是直接跳到块的开始。这似乎是唯一可以解释这一点的方法。)
  • 最后,我将CSV文件分为6个部分,并尝试逐一读取,但仍然得到MemoryError。
    • (我在运行下面的代码时监控了python的内存使用情况,发现每次python处理完一个文件并转到下一个文件时,内存使用量都会增加。很明显,panda在处理完前一个文件后并没有释放内存。)
代码可能没有意义,但这是因为我删除了它写入SQL数据库的部分,以简化它并隔离问题

import csv,pandas as pd
import glob
filenameStem = 'Crimes'
counter = 0
for filename in glob.glob(filenameStem + '_part*.csv'): # reading files Crimes_part1.csv through Crimes_part6.csv
    chunk = pd.read_csv(filename)
    df = chunk.iloc[:,[5,8,15,16]]
    df = df.dropna(how='any')
    counter += 1
    print(counter)

您可以尝试只解析您需要的那些列(如@BrenBarn在评论中所说):

PS这将在生成的数据框中至少包含17列中的4列

谢谢您的回复


经过一些调试,我找到了问题所在。熊猫的“iloc”子集创建了一个循环引用,防止了垃圾回收。详细的讨论可以在csv文件中找到。首先,将csv作为块并修复chunksize。使用chunksize或迭代器参数以块的形式返回数据。 语法:


然后连接块(仅对C解析器有效)

看起来您只想读取某些列。如果是这种情况,请查看
read\u csv
usecols
参数。您可能希望尝试以下答案:首先,使用
usecols
和列名只读取所需的列,这样就不会在不需要的列上浪费千兆字节,而这些列无论如何都只会删除,然后删除
chunk.iloc
行。其次,
为每一列使用
dtypes`参数来指定其类型,而不是浪费内存的字符串。第三,我怀疑你所说的
chunksize=number
没有用,会让事情变得更慢;告诉我们您尝试的实际具体
chunksize
值,以及您得到的时间安排(在您使用
usecols
dtypes
之后)。请接受您的回答,并在您的问题中编辑澄清行。否则,这个问题会误导人们,他们通常在寻找如何通过
pd.read\u csv
减少内存使用。在
pd期间,您应该始终使用
usecols
(和
dtypes
)参数。在不可能的情况下读取\u csv
,并且在对所选列进行切片之后,决不能依赖
.iloc[…]
,并期望垃圾收集来恢复浪费的千兆字节。
import os
import glob
import pandas as pd

def get_merged_csv(flist, **kwargs):
    return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)

fmask = 'Crimes_part*.csv'
cols = [5,8,15,16]

df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=cols).dropna(how='any')

print(df.head())
csv_onechunk = padas.read_csv(filepath, sep = delimiter, skiprows = 1, chunksize = 10000)