如何只将特定类型的行加载到数据帧中以避免内存过载

2024-10-04 05:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个91gb的数据帧,当我试图把它加载到内存中去处理它时,我的内存崩溃了。例如,是否可以只在m.0107\u f将所有数据中的行索引到Dataframe中,而不将完整数据加载到Dataframe中?你知道吗

我的数据集示例如下:

enter image description here

我想做的事-

df = pd.read_csv('/Volumes/big-flash-drive/asdf/FaceImageCroppedWithAlignment.tsv', sep='\t', nrows='m.0107_f', 
             names = ["Freebase MID", "EntityNameString", "ImageURL", "FaceID","FaceRectangle_Base64Encoded",
                       "FaceData_Base64Encoded"])

我知道这是不可能的,但也许有人可以帮助处理它


Tags: csv数据内存示例dataframedfreaddrive
2条回答

如果必须使用CSV文件,请尝试以下方法:

fn = '/Volumes/big-flash-drive/asdf/FaceImageCroppedWithAlignment.tsv'
cols = ["Freebase MID","EntityNameString","ImageURL", "FaceID",
        "FaceRectangle_Base64Encoded","FaceData_Base64Encoded"]
chunks = pd.read_csv(fn, sep='\t', chunksize=10**5, names=cols)
df = pd.concat([x.query("index == 'm.0107_f'") for x in chunks], ignore_index=True)

如果您可以以不同的格式存储数据-我强烈建议您使用HDF5格式或将数据存储在RDBMS数据库中:

演示:

df = pd.read_hdf('/path/to/file.h5', 'hdf_key', where="index == 'm.0107_f'") 

这将只读取满足where子句的行

import blaze
import pandas as pd
from io import StringIO

# using StringIO for demonstration-purposes! Don't actually do this in your code!
# your code would look like: data = blaze.data('myfile.csv') 
s = '''idx,MID,S,A
m.0107_f,a,1,True
m.0107_x,b,2,False
m.0107_f,c,3,True'''
data = pd.read_csv(StringIO(s)) 

data看起来像:

        idx MID  S      A
0  m.0107_f   a  1   True
1  m.0107_x   b  2  False
2  m.0107_f   c  3   True

现在火焰:

csv_data = blaze.data(data)
csv_data[csv_data['idx'] == 'm.0107_f']

结果:

        idx MID  S     A
0  m.0107_f   a  1  True
2  m.0107_f   c  3  True

这里的好处是使用blaze只加载内存中满足条件的项(相当于m.0107_f)。你知道吗

相关问题 更多 >