powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как открываются файлы весом по 1ТБ?
25 сообщений из 27, страница 1 из 2
Как открываются файлы весом по 1ТБ?
    #39105369
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например, есть несколько файлов весом по 1 ТБ. Оперативка ограничена. Из них надо считывать некоторые элементы и записывать в другой файл. Подходят ли для <ifstream> и <ofstream>? Правильно я понимаю, что они почти не поедают память, читают один объект за другим, запоминая позицию, а максимальная занятая память равна максимальной последовательности символов в файле?
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39105426
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_here,

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


Подходят ли для <ifstream> и <ofstream>?



мало того, что подходят, они еще и специально для этого были придуманы.


Правильно я понимаю, что они почти не поедают память, читают один объект за другим, запоминая позицию,


правильно.


а максимальная занятая память равна максимальной последовательности символов в файле?

максимально занятая память - это объем одного буфера. размер буфера величина переменная, и её по идее можно задать, но она все равно небольшая.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39105485
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

спасибо за ответ, а также за ответы по делу в предыдущих темах.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39106460
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос: по-моему, быстрее 1 раз загрузить в файл 1 Гб, чем 1000 раз по 1 Мб.
Как загрузить в файл большой vector?
Загрузит ли данный код 1 раз 1 Гб или будет загружать 1000 раз по 1 Мб?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> example;
    example.push_back("this");
    example.push_back("is");
    example.push_back("a");
    example.push_back("test");

    std::ofstream output_file("./example.txt");
    std::ostream_iterator<std::string> output_iterator(output_file, "\n");
    std::copy(example.begin(), example.end(), output_iterator);
}
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39107006
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereЕщё вопрос: по-моему, быстрее 1 раз загрузить в файл 1 Гб, чем 1000 раз по 1 МбОптимальный размер блока чтения 32-128 К Байт.
А вот ваши попытки натягивать сову на глобус будут череповаты и сове и глобусу.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39107063
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereЕщё вопрос: по-моему, быстрее 1 раз загрузить в файл 1 Гб, чем 1000 раз по 1 Мб.


Всё равно.
Код: plaintext
 1 * 1 *1024*1024 ~= 1000 * 1 *1024  
(на самом деле я уверен, что ты имел в виду 1024 Мб, а не 1000)

log_hereКак загрузить в файл большой vector?


Обычно о таком говорят "выгрузить".
Путём совершения последовательных записей в этот файл.
Для больших объемов важно выводить не каждый элемент вектора отдельно,
а пачками по кол-ву элементов, влазящих в один буфер. Можно выводить
одной операцией, тогда CRL и операционка это сделают сами,
главное -- не выводить каждый элемент отдельно -- их много, поэтому
чисто на входах и выходах в функцию потеряется много времени.

log_hereЗагрузит ли данный код 1 раз 1 Гб или будет загружать 1000 раз по 1 Мб?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> example;
    example.push_back("this");
    example.push_back("is");
    example.push_back("a");
    example.push_back("test");

    std::ofstream output_file("./example.txt");
    std::ostream_iterator<std::string> output_iterator(output_file, "\n");
    std::copy(example.begin(), example.end(), output_iterator);
}



Я тут что-то не понял, тут нет ни гигабайта, ни мегабайта даже. и элементов не 1000, а 5.
Если вопрос в том, запишутся ли в файл все слова одной операцией -- ответ "нет, не запишутся".
Это по сути просто цикл по элементам, записывающий каждый элемент в поток.
Данные каждого элемента расположены в разных участках памяти (каждая строка std::string хранит данные в своём буфере), поэтому код даже теоретически не может быть оптимизирован с выполнения пяти операций вывода с каждым элементом в выполенние
одной операции вывода над всеми элементами сразу.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39107081
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой вот код, наоборот, будет выводить данные в файл оптимально, за одну логическую операцию и
физически блоками по N килобайт, в соотв. с размерами буферов файловой системы и CRT.

Плата за это -- расход памяти размером с этот файл.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
File Edit Options Buffers Tools C++ Help
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#include <sstream>

int main()
{
  std::vector<std::string> example;
  example.push_back("this");
  example.push_back("is");
  example.push_back("a");
  example.push_back("test");

  std::stringstream s;
  std::ostream_iterator<std::string> output_iterator(s, "\n");
  std::copy(example.begin(), example.end(), output_iterator);

  std::ofstream out("./example.txt");
  out.write(s.str().c_str(),s.str().length());
}
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39107215
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

то есть, такой код выгрузит в файл вектор за наилучшее время, блоками по N = 32-128 кБ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#include <fstream>
#include <iterator>
#include <string>
#include <vector>
#include <sstream>

int main()
{
    std::vector<int> example;
    example.push_back(1);
    example.push_back(2);
    example.push_back(3);
    //...
    //...
    //...
    example.push_back(1024 * 1024 * 1024 / sizeof(int));

    std::stringstream s;
    std::ostream_iterator<std::string> output_iterator(s, "\n");
    std::copy(example.begin(), example.end(), output_iterator);

    std::ofstream out("./example.txt");
    out.write(s.str().c_str(),s.str().length());
}
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39107220
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка
Код: plaintext
1.
2.
3.
std::ostream_iterator<int> output_iterator(s, "\n");
// std::ostream_iterator<std::string> output_iterator(s, "\n"); здесь неправильно
 
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39108457
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
file mapping для чтения
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39108794
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepsikfile mapping для чтения


он только ничего не ускоряет.
я честно говоря вообще не понимаю, зачем он нужен в мирной жизни
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109378
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос зашёл ещё дальше.
Как прочесть файл в несколько потоков?

Например, есть 4 потока и файл из 4 000 000 000 строк. Надо загрузить по 1 000 000 000 строк в 4 соответствующих массива. Можно ли для ускорения сделать это многопоточно и как это сделать?
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109387
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereВопрос зашёл ещё дальше.
Как прочесть файл в несколько потоков?

Например, есть 4 потока и файл из 4 000 000 000 строк. Надо загрузить по 1 000 000 000 строк в 4 соответствующих массива. Можно ли для ускорения сделать это многопоточно и как это сделать?

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

Со "строками" сложнее -- не понятно, что такое "строка" и как их делить между потоками на границах участков файла,
но в принципе это возможно.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109395
log_here
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

В файле элементы разделены
Код: plaintext
1.
"\n"


А как прочесть, например, вторую четверть файла?
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109402
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivчитаешь независимо в фоновых потоках, потом сливаешь все результаты в
один.
Не сработает.

Аффтар, обломись, чтение и так будет идти на максимальной для дисковой подсистемы
скорости. Попытка распараллелить скорость только уменьшит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109491
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак элементарно, вычитываешь длину файла, разбиваешь его на участки (куски) в соответствии с уровнем параллелизма,
читаешь независимо в фоновых потоках, потом сливаешь все результаты в один.
Нет. Головки чтения HDD не распарралелятся. Наоборот, будут больше скакать туда-сюда и будет медленнее. На SSD будет одинаково.
С чтением из инета сработает, в два потока качается быстрее чем в один.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109494
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivчитаешь независимо в фоновых потоках, потом сливаешь все результаты в
один.
Не сработает.

Аффтар, обломись, чтение и так будет идти на максимальной для дисковой подсистемы
скорости. Попытка распараллелить скорость только уменьшит.


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

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

к тому же некоторый уровень параллелизма может быть в подсистеме ввода/вывода, это тоже может дать ускорение.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109526
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivLepsikfile mapping для чтения
он только ничего не ускоряет.
я честно говоря вообще не понимаю, зачем он нужен в мирной жизни

Положительно влияет на скорость карьерного и зарплатного роста для тех кто понимает.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109551
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereВопрос зашёл ещё дальше.
Как прочесть файл в несколько потоков?

Например, есть 4 потока и файл из 4 000 000 000 строк. Надо загрузить по 1 000 000 000 строк в 4 соответствующих массива. Можно ли для ускорения сделать это многопоточно и как это сделать?
Этот вопрос достаточно синьорный. Он выходит за рамки обычного школьного программирования или собеседования.
Чтобы на него ответить правильно нужно задать встречные вопросы - а что есть ДИСК на котором лежит этот файл?
Если это RAID10 массив то параллелить имеет смысл (наверное. Я так думаю.).
Eсли это сетевая система хранения типа Clarion где блинов больше чем в обычном системнике
то степень параллелизма можно (наверное) еще поднять побольше чем в варианте с RAID.
Если это SSD диск то у него (наверное) тоже есть некие свои характеристики.
Возможно параллелизм имеет смысл. А для 2.5 дюймового ХДД типа ноутбучного
лучше оставить 1 поток (наверное).

Во всех случаях мы решаем уравнение где много неизвестных. И сказать сколько
надо потоков 1,2,3,4 - очень трудно. Лучше сделать серию экспериментов для нужного
КЛАССА системы хранения и записать себе в блокнотик результат и сделать выводы.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109594
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
log_hereВопрос зашёл ещё дальше.
Как прочесть файл в несколько потоков?

Например, есть 4 потока и файл из 4 000 000 000 строк. Надо загрузить по 1 000 000 000 строк в 4 соответствующих массива. Можно ли для ускорения сделать это многопоточно и как это сделать?Ох, простихоспаде, в какой форум меня занесло. xD

Тут все в принципе просто. Ключом к пониманию, надо ли грузить многопоточно или однопоточно, есть понимание, что является у вас узким местом: процессор или диск. Операция "загрузить" несколько абстрактная, и вполне вероятно что она может подразумевать некоторые действия кроме непосредственно io-операций. Просто так читать в буфер ради чтения смысла нет же, верно? Цель или в память загрузить данные, или сделать над ними какие-то операции, или записать куда, или еще что. На все это нужны процессорное время.

Поэтому если ваша дисковая выдает миллиард iops, а вычислять надо много, то имеет смысл параллелить. Если наоборот, то сильно (или вообще) парралелить смысла нет -- чем в большее кол-во потоков сканится файл, тем сильнее последовательное чтение превращается в рандомное, что мало чувствительно для SSD, но особо заметно для обычных дисков, даже если их много.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109655
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TС чтением из инета сработает, в два потока качается быстрее чем в один.
Это "Ахилесова пята" многих файловых систем.
А в целом если хотите /Dimitry Sibiryakov подкалываю/ чтобы Firebird медленно работал, то установите вместе
с ним какой-нибудь soft активно использующий hdd.

PS: Замерьте время копирование одного файла 50GB и 100000 фалов общим размером 50GB ...
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39109810
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012PS: Замерьте время копирование одного файла 50GB и 100000 фалов общим размером 50GB ...
Перегнать слона из пункта А в пункт Б и перегнать стаю куриц (общим весом со слона) тем же маршрутом это два разных действия и не надо их сравнивать.
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39110207
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tи не надо их сравнивать
Кому как ...
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39110210
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я правиьно понимаю, ос пишет порциями, поэтому ей все равно,что ей скормили файл целиком.. все равно он будет разбит на буферы..
...
Рейтинг: 0 / 0
Как открываются файлы весом по 1ТБ?
    #39110221
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример с 10000 файлами неудачен. Возможно Дима хотел сказать другое.

Я вижу аналогии с Hadoop. Если ты хочешь что-то ускорить (поиск по файловой системе)
сделай так чтобы поисковый массив бился на чанки, зеркалировался по узлам
и отдавался процессам отображения и свёртки.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как открываются файлы весом по 1ТБ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]