MemoryError pandas - PullRequest
       3

MemoryError pandas

0 голосов
/ 25 августа 2018

Я пытаюсь объединить два фрейма данных, используя pandas, но получаю Ошибка памяти . Это может быть проблема с памятью, так как мои файлы имеют ~ 40 000 000 строк (df1) и 80 000 000 строк с 5 столбцами (df2a), однако, когда я попытался объединить другой аналогичный файл с 90 000 000 строк и 5 столбцами (df2b) ), объединение работает.

Вот мой код:

# Merge the files with pandas python
import pandas as pd

# Read lookup file from GTEx
df1 = pd.read_table("GTEx.lookup_table.txt.gz", compression="gzip", sep="\t", header=0)
df1.columns = df1.columns.str.replace('rs_id_dbSNP147_GRCh37p13', 'rsid')

df2a = pd.read_table("Proximal.nominals.FULL.txt.gz", sep=" ", header=None, compression="gzip") # this file gives the Memory error
df2b = pd.read_table("Proximal.nominals2.FULL.txt.gz", sep=" ", header=None, compression="gzip") # this file merges just fine
df2a_merge = pd.merge(left=df1, right=df2a, left_on="rsid",  right_on='rsid')
df2b_merge = pd.merge(left=df1, right=df2b, left_on="rsid",  right_on='rsid')

Я посмотрел на объем памяти, который использует каждый из файлов, но df2b занимает больше памяти, но все равно отлично сливается:

>>>print("df2a dataset uses ",df2a.memory_usage().sum()/ 1024**2," MB ")
  ('df2a dataset uses ', 3342, ' MB ')

>>>print("df2b dataset uses ",df2b.memory_usage().sum()/ 1024**2," MB ")
  ('df2b dataset uses ', 3470, ' MB ')

Кроме того, типы данных одинаковы в df2a и 2f2b:

gene_id      object
rsid         object
distance      int64
n_pval      float64
nslope       float64
dtype: object

И эту ошибку я получаю:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/users/jfertaj/python/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 54, in merge
return op.get_result()
  File "/users/jfertaj/python/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 569, in get_result
join_index, left_indexer, right_indexer = self._get_join_info()
  File "/users/jfertaj/python/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 734, in _get_join_info
right_indexer) = self._get_join_indexers()
  File "/users/jfertaj/python/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 713, in _get_join_indexers
how=self.how)
  File "/users/jfertaj/python/lib/python2.7/site-packages/pandas/core/reshape/merge.py", line 998, in _get_join_indexers
return join_func(lkey, rkey, count, **kwargs)
  File "pandas/_libs/join.pyx", line 71, in pandas._libs.join.inner_join (pandas/_libs/join.c:120300)

Кстати, я хочу сделать внутреннее слияние

1 Ответ

0 голосов
/ 27 августа 2018

Я рекомендую использовать пакет dask для этого типа больших фреймов данных.В частности, посмотрите его DataFrame , который является способом обработки больших панд DataFrames и распараллеливания вычислений на нем.

Ваш код может быть изменен так:

import dask.dataframe as dd

dd1 = dd.from_pandas(df1, npartitions=10)
dd2a = dd.from_pandas(df2a, npartitions=10)

dd2a_merge = dd1.merge(dd2a, left_on="rsid",  right_on='rsid')
dd2a_merge = dd2a_merge.compute()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...