已弃用的low_memory选项
low_memory选项没有被正确地弃用,但它应该是,因为它实际上不做任何不同的事情[source]
你得到这个low_memory警告的原因是因为猜测每列的dtypes是非常内存要求。 Pandas尝试通过分析每列中的数据来确定要设置的dtype。
Dtype猜测(非常糟糕)
Pandas只能确定读取整个文件时列应该具有的dtype。这意味着在读取整个文件之前不能真正解析任何内容,除非您在读取最后一个值时有必要更改该列的dtype。
考虑具有称为user_id的列的一个文件的示例。
它包含1000万行,其中user_id始终是数字。
因为熊猫不知道它只是数字,它可能会保持它作为原始字符串,直到它读取整个文件。
指定dtypes(应始终执行)
添加
dtype={'user_id': int}
到pd.read_csv()调用将使熊猫知道什么时候开始读取文件,这只是整数。
还值得注意的是,如果文件中的最后一行将在“user_id”列中写入“foobar”,如果指定了上述dtype,加载将会崩溃。
定义dtypes时中断的损坏数据示例
import pandas as pd
from StringIO import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": object})
ValueError: invalid literal for long() with base 10: 'foobar'
蠢,警告,注释
设置dtype = object将会使上面的警告静音,但不会使它更有效的内存,只有处理高效的任何东西。
设置dtype = unicode不会做任何事情,因为numpy,一个unicode表示为对象。
转换器的使用
@sparrow正确指出转换器的使用,以避免熊猫在指定为int的列中遇到“foobar”时冒出来。我想补充一点,转换器在大熊猫中使用非常繁重和低效,应该作为最后的手段。这是因为read_csv进程是单个进程。
CSV文件可以逐行处理,因此可以通过简单地将文件分割成段并运行多个进程,熊猫不支持的并行处理更高效地并行处理多个转换器。但这是一个不同的故事。