2014-05-17 4 views
-1

Я читаю полный файл в строку. Это очень быстро. (Пример файла 180Mb - 2s) Затем я извлекаю некоторые значения из строки с помощью >> оператора и создаю из нее несколько массивов и вставляем массивы в структуру и добавляем каждую структуру в вектор.Быстрое преобразование данных из текстового файла

Я пытаюсь найти узкое место, потому что это очень медленно (но, возможно, вы не можете сделать что-нибудь)

  1. является >> подход быстро?

    string str; // gets filled with the file 
    struct A; 
    std::vector<A> b; // global variables 
    // in the function inside the loop 
    str >> a.val 
    A a; 
    b.push_back(a); 
    
  2. Имеет ли вектор право собственности на a или он делает копию? Все еще в стеке? У меня около 60.000 структур, которые вставляют в вектор. Это быстрый подход или есть лучший.

+0

'std :: vector' берет копию' a'. Вы можете избежать этого, используя 'std :: vector :: emplace'. – 101010

+0

В принципе, ваш код в порядке! В противном случае ваш вопрос слишком широк, извините! Обратитесь к доступным [C++ ссылкам] (http://en.cppreference.com). –

ответ

1

C I/O часто будет быстрее, чем C + + I/O. Попробуйте разобрать куски данных с помощью fscanf() (см.: http://www.cplusplus.com/reference/cstdio/fscanf/), и вы, скорее всего, найдете, что подход C работает намного быстрее.

2

Вопрос - это подход к быстрому?

Fast is relative. С чем вы сравниваете?

Вопрос Включен ли вектор в собственность или он делает копию?

Ответstd::vector::push_back() делает копию входного объекта.

Вопрос Есть еще в стеке?

Ответ Судя исключительно по размещенному коду, да, оба A и b находятся в стеке.

Queston У меня есть около 60.000 структур, которые вставляются в вектор. Это быстрый подход или есть лучший?

Ответ Вы можете получить некоторую работу, создав b с требуемым размером и считывания данных непосредственно в объекты в b.

std::vector<A> b(60000); 
for (i = 0; ; ++i /* Use whatever looping construct you can */) 
{ 
    str >> b[i].val; 
} 

Update

Если вы в состоянии, писать и читать данные в двоичной форме будет самым быстрым. Используйте std::ostream::write() для записи данных и std::istream::read() для чтения данных.

Смежные вопросы