Максимальная емкость std :: vectorв IBM i - PullRequest
0 голосов
/ 21 декабря 2018

Недавно я обнаружил странное поведение определения размера std::vector на IBM i.Итак, когда вы определяете

std::vector<std::string> vec;

Система возвращает около 87M для vec.max_size();

Однако, когда я делаю:

vec.reserve(400000); илиеще больше он терпит неудачу без исключения памяти и соответствующего запроса: Signal SIGABRT raised (abnormal termination).

Я наконец-то выяснил, что 300k - это своего рода порог для вектора строк для запуска кода.

Здесьэто журнал:

Procedure:          _CXX_PEP__Fv                                                                                                   
      TESTPGM      TESTLIB      7                                       CALLER     0000000000000036 TESTPGM      QTEMP        Н      
Procedure:          main
      TESTPGM      TESTLIB      4                                       CALLER     0000000000000036 TESTPGM      QTEMP        Н      
Procedure:          reserve__Q2_3std6vectorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__TQ2_3std9allo 
torXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc____FUi                                                 
      TESTPGM      TESTLIB      1                                       CALLER     0000000000000036 TESTPGM      QTEMP        Н      
Procedure:          allocate__Q2_3std9allocatorXTQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___FUiPCv   
      TESTPGM      TESTLIB      1                                       CALLER     0000000000000036 TESTPGM      QTEMP        Н      
Procedure:          _Allocate__3stdHQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___UiPQ2_3std12basic_str 
gXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc___PQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__     
      QYPPRT370  QSYS         12                                        CALLER     0000000000000036 NWSCTODF37 QBUILDSS1    Н      
Procedure:          __nw__FUi                                                                                                      
      QYPPRT370  QSYS         2                                         CALLER     0000000000000036 NOMEMORY37 QBUILDSS1    Н      
Procedure:          _Nomemory__3stdFv                                                                                              
      QYPPRT370  QSYS         11                                        CALLER     0000000000000036 THROW37    QBUILDSS1    Н      
Procedure:          __Throw                                                                                                        
      QYPPRT370  QSYS         24                                        CALLER     0000000000000036 DOTHROW37  QBUILDSS1    Н
Procedure:          __DoThrow                                                                                                
      QYPPRT370  QSYS         16                                        CALLER     0000000000000036 EXCEPTIO37 QBUILDSS1    Н
Procedure:          terminate__3stdFv                                                                                        
      QYPPRT370  QSYS         1                                         CALLER     0000000000000036 EXCEPTIO37 QBUILDSS1    Н
Procedure:          myabort__3stdFv                                                                                          
      QC2UTIL1   QSYS         2                                         CALLER     0000000000000036 QC2TERM    QBUILDSS1    Н
Procedure:          abort                                                                                                    
      QC2UTIL1   QSYS         6                                         CALLER     0000000000000036 QC2SIGNL   QBUILDSS1    Н
Procedure:          raise                                                                                                    
      QMHPDEH    QSYS                                              012E *DFTACTGRP 0000000000000001                         Н
      QMHUNMSG   QSYS                                              0196 *DFTACTGRP 0000000000000001                         Н
      QMHAPD     QSYS                                              02EC *DFTACTGRP 0000000000000001                         Н

Для этой работы установлено CPUTIME *NOMAX и MAXTMPSTG *NOMAX.

Итак, мне интересно, ограничивает ли ibm меня вектором 300k элементов или я испортилгде-то.

Или IBM просто заставляет меня использовать вектор векторов по какой-то причине?

Я нахожусь на OS 7.3 TR5, если это имеет значение

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я попробовал следующую программу:

#include <vector>                      
#include <string>                      
int  main(void)                        
{                                      
  int i;                               
  std::vector<std::string> * vec;      
  i = vec->max_size();                 
  vec = new std::vector<std::string>;  

  vec->reserve(i);                     
  delete vec;                          
  return 0;                            
}                                      

I compiled as follows: 
CRTCPPMOD MODULE(TEST) DBGVIEW(*ALL) TERASPACE(*YES *TSIFC) STGMDL(*TERASPACE) 
  DTAMDL(*LLP64) RTBND(*LLP64)                                       
CRTPGM PGM(TEST) STGMDL(*TERASPACE) 

Это показывает, что max_size возвращает 178,956,970, намного большее значение, чем вы видели.

Тем не менее, передача этой функции в Reserve () вызывает sigabort и убивает задание!

Однако мне удалось успешно передать 89000000 в Reserve () (заполнение вектора строками вполне можетоднако вызвать сбой!)

Я не уверен во всех кровавых деталях, но подозреваю, что это в значительной степени связано с реализацией кучи без тераспространства (которая ограничивает непрерывное хранение до 16 МБ) по сравнению с Teraspace, гдеограничение составляет 4 ГБ непрерывно адресуемого выделения.Вы можете поиграть с опциями, которые я указал, чтобы увидеть, что произойдет.

Обратите внимание, я выделил вектор в куче.Вещи могут быть разными для стека или статически распределенного вектора.

0 голосов
/ 21 декабря 2018

vactor::max_size() просто даст вам теоретические значения.

То, сможете ли вы на самом деле выделить память для этих многих элементов, будет зависеть от фактической памяти, доступной во время выполнения.

...