C ++ быстро выдает содержимое массива int в текстовый файл - PullRequest
2 голосов
/ 14 января 2020

Я хотел бы сбросить содержимое большого массива в текстовый файл. В настоящее время я использую циклы fstream и for для выполнения sh this.

ofstream file;
file.open("vectors.csv"); 
for (int i = 0 ; i < N ; i++) {
        file << array[3*i] << "," << array[3*i+1] << "," << array[3*i+2] << endl;
}

Массив содержит компоненты xyz группы векторов, и в настоящее время они записываются в файл csv, разделенный запятой и endl, используя a для l oop. В настоящее время этот метод занимает много времени, так как я пытаюсь написать около 10 миллионов векторов. Если я могу вставить символы-разделители в массив, есть ли более быстрый способ вывести его во внешний текстовый файл?

TIA

Ответы [ 4 ]

1 голос
/ 14 января 2020

cout << endl: вставляет новую строку и очищает поток. (Может быть служебной информацией в зависимости от варианта использования) </p>

cout << "\ n": вставляет только новую строку. </p>

для простого объяснения визита: https://cppkid.wordpress.com/2008/08/27/why-i-prefer-n-to-stdendl/

1 голос
/ 14 января 2020

Не используйте std::endl для записи новой строки, так как это приведет к очистке буфера, что значительно повлияет на производительность. Вместо этого вам следует использовать либо '\n', либо "\n". И используйте std::endl только если вам действительно нужен буфер для очистки.

0 голосов
/ 14 января 2020

В своем ответе я предполагаю, что тип данных вашего массива - int И вы не обязаны использовать разделители и создавать читаемые CSA-файлы huaman. Я предположил, что вы хотите выгрузить и перезагрузить массив из файла как можно быстрее.

Память в массиве непрерывна. Таким образом, вы можете сбросить и перезагрузить его данные сразу:

#include <iostream>
#include <array>
#include <fstream>
#include <iostream>
#include <array>


int main(int argc, char *argv[])
{
    static const int SIZE = 3*100;
    //writing
    {
        std::array<int,SIZE> a;
        //....  filling array
        a[0] = 123;
        a[1] = 456;
        std::ofstream myfile ("out_array_example.bin",std::ios::binary);
        if (myfile.is_open())
        {
            myfile.write((const char*)(a.begin()),a.size());
            myfile.close();
        }
    }
    //////////////////////
    //reading
    {
        std::ifstream file("out_array_example.bin", std::ios::binary);
        std::array<int,SIZE> a;
        if (file.read((char*)a.begin(), SIZE))
        {
            std::cout << "Now my array is reloaded:" << a[0] << " , " << a[1] << std::endl;
        }
    }
    return 0;
}
0 голосов
/ 14 января 2020

Есть несколько вещей, которые вы можете сделать. Вы можете предоставить большой буфер для потока, использовать одиночные символы для разделителя ',' и избегать std::endl, который преждевременно очищает буфер.

char buffer[8096]; // larger = faster (within limits)
std::ofstream file;
file.rdbuf()->pubsetbuf(buffer, sizeof(buffer));

file.open("vectors.csv");
for (std::size_t i = 0 ; i < N ; i++) {
    // use single chars '\n'
    // use single chars ','
    file << array[3*i] << ',' << array[3*i+1] << ',' << array[3*i+2] << '\n';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...