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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.