LINUX.ORG.RU

работа с файлом C++ way


0

0

НУжно вычитывать бинарные данные из файла. Размер - единицы Гб.
Какой наиболее быстрый в плюсах способ чтения данных из любого места файла ?
Сейчас так: ifstream и read. Будет ли через mmap быстрее. И как mmap
использовать лучше в плюсах (может аналог какой есть ?) ? А то

char *in_data_ptr;

in_data_ptr = (char *) mmap(...);

как-то не по плюсовому, кажется ).


>как-то не по плюсовому, кажется ).

Забей. Ну, если религия мучает, деструктор напиши.

Absurd ★★★
()
Ответ на: комментарий от re1l

давайте напишем крохотную программку для объединения двух отсортированных массивов в один( тоже отсортированный ), а потом сравним у кого из нас код получится меньше и быстрее

lester ★★★★
()

Лучше подумай об нищебродах на 32х битных системах, у них твой код с mmap работать не будет.

vnovouhov
()

> как-то не по плюсовому, кажется ).

Кошерно-кошерно. C либу использовать из C++ - распространенная практика. Кто ж тебе будет писать стандартную либу platform-specific? Не думаю что mmap как таковой есть в винде - аналог впрочем должен быть.

Spectr ★★★
()
Ответ на: комментарий от lester

>давайте напишем крохотную программку для объединения двух отсортированных массивов в один( тоже отсортированный ), а потом сравним у кого из нас код получится меньше и быстрее

интересно было бы на твой код взглянуть..

mono ★★★★★
()
Ответ на: комментарий от lester

>давайте напишем крохотную программку для объединения двух отсортированных массивов в один( тоже отсортированный ), а потом сравним у кого из нас код получится меньше и быстрее

давайте )

aunt
()
Ответ на: комментарий от lester

> давайте напишем крохотную программку для объединения двух отсортированных массивов в один( тоже отсортированный ), а потом сравним у кого из нас код получится меньше и быстрее

Just use std::merge, Luke !

d_a ★★★★★
()
Ответ на: комментарий от d_a

> Just use std::merge, Luke !

Взял и всю интригу испортил :/

const86 ★★★★★
()
Ответ на: комментарий от mono

> Ну блин.. так не интересно.

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

d_a ★★★★★
()

#include <boost/interprocess/file_mapping.hpp>

using boost::interprocess;
file_mapping m_file
   ("/usr/home/file"       //filename
   ,read_write             //read-write mode
   );

using boost::interprocess;
std::size_t FileSize = ...

//Map the second half of the file
mapped_region region
   ( m_file                   //Memory-mappable object
   , read_write               //Access mode
   , FileSize/2               //Offset from the beginning of shm
   , FileSize-FileSize/2      //Length of the region
   );

//Get the address of the region
region.get_address();

//Get the size of the region
region.get_size();

http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess/sharedmemorybetweenp
rocesses.html#interprocess.sharedmemorybetweenprocesses.mapped_file

stpg
()
Ответ на: комментарий от ip1981

> У вас проблема не в программе, а в организации данных.

Такое ляпнуть, не зная ни задачи нифига (что, собственно, к вопросу никак не относится), под силу только настоящему джедаю-телепату и гуру.

drZlo
() автор топика
Ответ на: комментарий от drZlo

> А вот это интересно, спасибо. А по скорости это с mmap как соотносится ?

Это и есть mmap. Обернутый в C++ стайл. И ещё код под офтопиком ещё работает (используя Win32).

stpg
()
Ответ на: комментарий от lester

более интересно это слить n отсортированных массивов

Reset ★★★★★
()

Да, и еще, как в плюсах кошерно парсить бин файл, в котором данные разнородные ? Т.е. есть массивы uint32, float, int16, но и одиночные uint32 и т.д. В Си создавал структуры (типа uint32 A, double BB[100], и т.д.) и приведение типов, memcpy. Так, конечно, делать религия не запрещает, но может кошерней ?

drZlo
() автор топика
Ответ на: комментарий от vasil

>Разнородные данные надо хранить в текстовом формате. >Например XML.

Можно и в бинарном ASN.1

Absurd ★★★
()
Ответ на: комментарий от vasil

> Разнородные данные надо хранить в текстовом формате.
> Например XML.


и на порядки терять в скорости?

lester ★★★★
()
Ответ на: комментарий от lester

>> Разнородные данные надо хранить в текстовом формате. >> Например XML.

>и на порядки терять в скорости?

По сравнению с IO парсинг файла это зеро.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> По сравнению с IO парсинг файла это зеро.

да конечно

lester ★★★★
()
Ответ на: комментарий от stpg

Блин, а почему при использовании using boost::interprocess; вылазит куча левых ошибок ? Типа:

error: expected primary-expression before ‘>’ token
error: ‘vec1’ was not declared in this scope
error: reference to ‘vector’ is ambiguous

И так на каждый вектор...

Boost 1.37.0.

drZlo
() автор топика
Ответ на: комментарий от Absurd

> По сравнению с IO парсинг файла это зеро.

объем XML файла будет в разы больше чем бинарного - накладные расходы на I/O возрастут.

Reset ★★★★★
()
Ответ на: комментарий от drZlo

> В Си создавал структуры (типа uint32 A, double BB[100], и т.д.) и приведение типов, memcpy

Я надесю что ты не просто так читал/писал структуры, а ещё учитывал выравнивание и порядок байт? А с числами с плавающей точкой вообще жопа, если задуматься...

Deleted
()
Ответ на: комментарий от drZlo

> error: reference to ‘vector’ is ambiguous

глобальное объявление

using std;
using boost;

это очень плохой тон, ведущий к неоднозначностям. лучше всегда писать std::vector, std::pair, boost::shared_ptr, ...

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

применять using можно в отдельной функции, при условии, что обращений к неймспейсу слишком много. Либо в класе, по аналогичным причинам. в небольшой функции на 20 строк 5 раз написать std:: не проблема, 20 - уже лучше применить using std; (и замениь все конфликтующие определения на точные неймспейсы)

stpg
()
Ответ на: комментарий от Reset

> заменить vector на std::vector ?

Так ведь
using namespace std;
еще
using namespace boost::lambda;
и все ОК.
А вот
using namespace boost::interprocess; и понеслась...

drZlo
() автор топика
Ответ на: комментарий от stpg

> в небольшой функции на 20 строк 5 раз написать std:: не проблема, 20 - уже лучше применить using std;

В том-то и дело, что std дофига. Решил проблему так:

using namespace std;
using namespace boost;
using namespace lambda;

interprocess::file_mapping m_file ();

Так как обращений к boost::interprocess гораздо меньше, то и ... сним.

drZlo
() автор топика
Ответ на: комментарий от drZlo

про директивы using и объявления using и конфликты имен читайте раздел 8.2.8.2 книги Б.Страуструпа, там описано решение проблемы

vasil
()
Ответ на: комментарий от Reset

>> По сравнению с IO парсинг файла это зеро.

>объем XML файла будет в разы больше чем бинарного - накладные расходы на I/O возрастут.

Смотря чего там хранить. Если png или jpg надо в XML засунуть, то это через base64-секцию делается обычно.

Absurd ★★★
()
Ответ на: комментарий от Reset

>И получим разрастание в полтора раза. Смысл какой сего изврата?

MMS-ки именно так передаются, протокол называется MM7.

Absurd ★★★
()
Ответ на: комментарий от Absurd

Ну идиоты, что сказать. Значит не жалко им денег на железо.

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.