我的CSV文件无法容纳系统内存。我想使用Pandas读取分散在文件中的少量行。
我认为我可以按照以下步骤操作而无需熊猫:How to read specific lines of a large csv file
在熊猫中,我试图使用跳栏仅选择我需要的行。
# FILESIZE is the number of lines in the CSV file (~600M)
# rows2keep is an np.array with the line numbers that I want to read (~20)
rows2skip = (row for row in range(0,FILESIZE) if row not in rows2keep)
signal = pd.read_csv('train.csv', skiprows=rows2skip)
我希望这段代码能很快返回一个小的数据帧。但是,这样做是在几分钟内开始消耗内存,直到系统变得无响应为止。我猜想它会先读取整个数据帧,然后再删除row2skip。
为什么此实现如此低效?如何仅使用rows2keep中指定的行有效地创建数据框?
答案 0 :(得分:1)
尝试一下
train = pd.read_csv('file.csv', iterator=True, chunksize=150000)
如果您只想读取前n行:
train = pd.read_csv(..., nrows=n)
如果您只想读取n到n + 100之间的行
train = pd.read_csv(..., skiprows=n, nrows=n+100)
答案 1 :(得分:0)
chunksize
应该有助于限制内存使用。另外,如果您只需要几行,一种可能的方法是先读取所需的熊猫行,然后仅用该子集喂read_csv
。代码可能是:
lines = [line for i, line in enumerate(open('train.csv')) if i in lines_to_keep]
signal = pd.read_csv(io.StringIO(''.join(lines)))
答案 2 :(得分:0)
您好,您也可以尝试使用黄昏来读取文件。它速度更快,并且不会占用太多内存。