MemoryError при попытке объединить огромные кадры данных из read_csv - PullRequest
2 голосов
/ 10 марта 2019

У меня большой набор данных, который содержит приблизительные данные 109G, которые разделены на 245 файлов .vsc.gz. Я пытался открыть каждый из них, а затем присоединиться ко всем. Первый шаг - ОК, я успешно достиг того, чего хочу, но позже, когда я попытался их объединить, я получил следующую ошибку.

Traceback (most recent call last):
  File "CleanDataVR2.py", line 92, in <module>
    df_concated = pd.concat(dl)
  File "/share/apps/anaconda/2/2.5.0/lib/python2.7/site-packages/pandas/tools/merge.py", line 835, in concat
    return op.get_result()
  File "/share/apps/anaconda/2/2.5.0/lib/python2.7/site-packages/pandas/tools/merge.py", line 1025, in get_result
    concat_axis=self.axis, copy=self.copy)
  File "/share/apps/anaconda/2/2.5.0/lib/python2.7/site-packages/pandas/core/internals.py", line 4474, in concatenate_block_managers
    for placement, join_units in concat_plan]
  File "/share/apps/anaconda/2/2.5.0/lib/python2.7/site-packages/pandas/core/internals.py", line 4579, in concatenate_join_units
    concat_values = com._concat_compat(to_concat, axis=concat_axis)
  File "/share/apps/anaconda/2/2.5.0/lib/python2.7/site-packages/pandas/core/common.py", line 2741, in _concat_compat
    return np.concatenate(to_concat, axis=axis)
MemoryError

А потом мой код.

dl= []
dtype_dict= {'#RIC': 'str', 'Date[G]':'str', 'Time[G]':'str', 'Price': 'float16', 'Volume': 'float16'}

for f in file_list:
    df=pd.read_csv(f, compression='gzip',header=0, sep=',', 
               quotechar='"',usecols= 
               ['#RIC','Date[G]','Time[G]','Price','Volume'],
               dtype=dtype_dict,low_memory=False)
    df= df.dropna(subset=['Price']) 
    df['Tage'] = df['Volume'].map(volume_filter)
    dl.append(df)
df_concated = pd.concat(dl)

Эта функция с именем volume_filter - это просто функция, которую я написал для получения столбца с именем Tage. Так как эта часть работает хорошо, я не поместил это здесь. Каждый фрейм данных имеет такую ​​же структуру, как показано ниже.

            #RIC      Date[G]       Time[G]    Price  Volume   Tage
0         URKAq.L  01-SEP-2008  11:19:46.800   45.000   152.0   T200
8         URKAq.L  01-SEP-2008  11:28:53.769   45.000  2848.0  T3000
9         URKAq.L  01-SEP-2008  11:28:53.769   45.000  1725.0  T2000
11        URKAq.L  01-SEP-2008  11:28:53.844   45.000   427.0   T500
13        URKAq.L  01-SEP-2008  11:28:53.898   45.000   450.0   T500
15        URKAq.L  01-SEP-2008  11:28:53.981   45.000   200.0   T200
20        URKAq.L  01-SEP-2008  11:28:54.124   45.000   850.0   T900
21        URKAq.L  01-SEP-2008  11:28:54.124   45.000  1073.0  T2000
24        URKAq.L  01-SEP-2008  11:28:54.329   45.000   200.0   T200
25        URKAq.L  01-SEP-2008  11:28:54.617   44.965   310.0   T400
26        URKAq.L  01-SEP-2008  11:28:54.617   44.965   310.0   T400
29        URKAq.L  01-SEP-2008  11:29:04.522   45.025   620.0   T700
30        URKAq.L  01-SEP-2008  11:29:04.769   45.025   620.0   T700
31        URKAq.L  01-SEP-2008  11:30:21.974   45.000  2800.0  T3000
32        URKAq.L  01-SEP-2008  11:30:21.974   45.000   700.0   T700
35        URKAq.L  01-SEP-2008  11:30:22.036   45.000   679.0   T700
39        URKAq.L  01-SEP-2008  11:30:22.110   45.000   200.0   T200
40        URKAq.L  01-SEP-2008  11:30:22.114   45.000   250.0   T300
42        URKAq.L  01-SEP-2008  11:30:22.405   45.025   243.0   T300
43        URKAq.L  01-SEP-2008  11:30:22.663   45.025   243.0   T300
44        URKAq.L  01-SEP-2008  11:30:23.737   45.000  2550.0  T3000
47        URKAq.L  01-SEP-2008  11:30:23.769   45.000  1500.0  T2000
51        URKAq.L  01-SEP-2008  11:30:23.769   44.920   200.0   T200
52        URKAq.L  01-SEP-2008  11:30:23.856   44.900   150.0   T200
54        URKAq.L  01-SEP-2008  11:30:25.101   45.000  1901.0  T2000
56        URKAq.L  01-SEP-2008  11:30:25.145   44.900   650.0   T700
58        URKAq.L  01-SEP-2008  11:30:25.145   44.900   200.0   T200
64        URKAq.L  01-SEP-2008  11:30:37.648   44.950   195.0   T200
65        URKAq.L  01-SEP-2008  11:30:37.829   44.950   195.0   T200
68        URKAq.L  01-SEP-2008  11:30:47.743   44.950  1031.0  T2000

Я попробовал одно решение @B. M.

def byhand(dfs):
    mtot=0
    with open('df_all.bin','wb') as f:
        for df in dfs:
            m,n =df.shape
            mtot += m
            f.write(df.values.tobytes())
            typ=df.values.dtype                
    #del dfs
    with open('df_all.bin','rb') as f:
        buffer=f.read()
        data=np.frombuffer(buffer,dtype=typ).reshape(mtot,n)
        df_all=pd.DataFrame(data=data,columns=list(range(n))) 
    os.remove('df_all.bin')
    return df_all

Но я все еще получил следующую ошибку.

Traceback (most recent call last):
  File "CleanDataVR2.py", line 107, in <module>
    byhand(dl)
  File "CleanDataVR2.py", line 102, in byhand
    data=np.frombuffer(buffer,dtype=typ).reshape(mtot,n)
ValueError: cannot create an OBJECT array from memory buffer

Прямо сейчас я действительно запутался. Я запустил свой собственный код с 2 файлами в суперкомпьютере, и все это весело. Почему у меня возникает ошибка с большим количеством файлов? Плюс я использовал 5 * 256 ГБ памяти, которой должно быть достаточно.

...