2016-07-06 2 views
2

У меня есть файл поезда 3 Gb и тестовый файл 350 Мб, оперативная память 6 Гб. Эти файлы кажутся не слишком большими, чтобы удерживать их в памяти, но я даже не могу их добавить (произошла ошибка памяти).Как применить однострунное кодирование к большим файлам?

Мой текущий Подход выглядит следующим образом:

# reading files 
     dtypes = {'Semana' : 'int32', 
          'Agencia_ID' :'int32', 
          'Canal_ID' : 'int32', 
          'Ruta_SAK' : 'int32', 
          'Cliente-ID' : 'int32', 
          'Producto_ID':'int32', 
          'Venta_hoy':'float32', 
          'Venta_uni_hoy': 'int32', 
          'Dev_uni_proxima':'int32', 
          'Dev_proxima':'float32', 
          'Demanda_uni_equil':'int32'} 

train = pd.read_csv('train.csv', dtype = dtypes, usecols=["Semana", "Agencia_ID", "Canal_ID", 'Ruta_SAK', 'Cliente_ID', 'Producto_ID','Demanda_uni_equil']) 
test = pd.read_csv('test.csv',dtype = dtypes) 
ids = test['id'] 
test.drop(['id'], axis =1, inplace = True) 

shapeTrain = train.shape[0] 
shapeTest = test.shape[0] 

train = train.append(test) # raises memory error 

#applying one-hot encoding 
train = pd.concat([train, pd.get_dummies(train['Semana'],sparse=True)], axis=1, join_axes=[train.index]) 
train.drop([11,'Semana'],axis=1, inplace = True) 

train = pd.concat([train, pd.get_dummies(train['Producto_ID'],sparse=True)], axis=1, join_axes=[train.index]) 
train.drop([123,'Producto_ID'],axis=1, inplace = True) 


train = pd.concat([train, pd.get_dummies(train['Canal_ID'],sparse=True)], axis=1, join_axes=[train.index]) 
train.drop([11,'Canal_ID'],axis=1, inplace = True) 

# separating back to train and test 
test = train[shapeTrain:shapeTrain+shapeTest] 
train = train[0:shapeTrain] 

test['id'] = ids 

train.to_csv('train_1.csv', index=False) 
test.to_csv('test_1.csv', index=False) 

Я вижу 2 пути решения:

1) Как-то перебирать файлы:

df_train = pd.read_csv('train.csv', chunksize=1500) 
for chunk in df_train: 
    #apply one-hot encoding 

2) Для того, чтобы уменьшить количество столбцов, применяя однострунное кодирование только для обучения, а затем для тестирования, но для нового категориального значения, устанавливающего все столбцы на 0.

3) Используйте the hashing trick!

Как я могу решить проблему?

+0

Отметьте «хеш-трюк». Таким образом, (1) вам не нужно будет перебирать весь текст дважды и заранее знать все слова (2), вы будете контролировать количество ящиков. –

ответ

1

Как об указании типа данных при загрузке:

types = {'col1': np.dtype(type), 
    'col2': np.dtype(type), 
    'col3' : np.dtype(type), 
    'col4': np.dtype(type), 
    'col5': np.dtype(type) } 

train = pd.read_csv('train.csv', dtype=types) 

train.info() запустить, если вы можете загрузить его и проверить использование памяти.

+0

Итак, когда появляется ошибка? Во время чтения или при применении OHE? – ERed

+0

'train.append (test) # вызывает ошибку памяти – Rocketq

+0

Ok. Как насчет того, чтобы дать Даску попробовать? Это пакет, разработанный Continuum Analytics, который работает с базами данных dask, которые состоят из блоков данных pandas. Он использует все ваши ядра ПК для параллельной работы на кадрах данных, хранящихся либо в ОЗУ, либо на жестком диске, если он больше, чем объем памяти: http://dask.readthedocs.io/en/latest/dataframe-overview.html – ERed

0

Попробуйте добавить набор данных с ignore_index = True.

train.append(test, ignore_index=True) 
Смежные вопросы