Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2009, 07:47   #1
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию Ввод больших объемов данных из файла

Добрый день
У меня следующая ситуация - нужно считывать большие объемы данных (1-2 Гб) в массив из файла, файл бинарный, все значения идут подряд без пробелов и разделителей, консольное приложение.
Сейчас это реализовано следующим образом:
Код:
for (int i=0; i<n_func_p; i++) {
	fin.seekg((i),ios::beg);
	fin.read((char*)&main_arr[i],1);
	
	//cout << (int)main_arr[i] << endl;
	}
Т.е. я побайтово считываю файл сразу в массив, но данный метод у меня работает очень долго, каким образом можно считать этот файл в оперативную память в массив максимально быстро?
Заранее благодарен.
Molotoff вне форума Ответить с цитированием
Старый 01.04.2009, 10:19   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

То есть, получается у вас программа "кушает" 1-2Гб оперативной памяти? Не самый лучший подход. Может стоит сделать запись этого массива в другой, временный, файл, и работать потом с ним?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 01.04.2009, 10:33   #3
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

2Molotoff если работаешь винде, почитай про отображение файлов в память (file mapping). и не надо целиком считывать такой огромный файл. все зависит от того, что ты будешь делать с информацией, которая находится в этом файле.
vvviperrr вне форума Ответить с цитированием
Старый 01.04.2009, 12:24   #4
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

программа для научных расчетов, поэтому хранить такой массив просто жизненная необходимость, т.е. надо 2^32 итераций обращаться к файлу, а это долго, нужно чтоб обсчет происходил быстро, поэтому нужно, чтоб все хранилось в оперативке.
2vvviperrr - да работаю в винде, случаем ссылок под рукой нет про эту тему? буду очень признателен
Molotoff вне форума Ответить с цитированием
Старый 01.04.2009, 12:33   #5
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

И еще, описанным выше способом в память считывались 280 Мб в течении получаса, я считаю - это очень долго, поэтому и спрашиваю как можно этот процесс ускорить
Molotoff вне форума Ответить с цитированием
Старый 01.04.2009, 12:57   #6
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

Цитата:
И еще, описанным выше способом в память считывались 280 Мб в течении получаса, я считаю - это очень долго, поэтому и спрашиваю как можно этот процесс ускорить
Цитата:
fin.read((char*)&main_arr[i],1);
тыж читаешь по одному байту. поэтому и медленно. а насчет filemapping - google. инфы предостаточно. или Джеффри Рихтер. Создание эффективных win32 приложений
vvviperrr вне форума Ответить с цитированием
Старый 01.04.2009, 13:34   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Читать лучше согласно размеру кластера винта. Эдак по 4Кб или сколько у Вас там. По байту - жесть. Всё равно винт за раз прочитает целиком кластер, а не байт, а тут лишние обращения по кэшам идут.
pu4koff вне форума Ответить с цитированием
Старый 01.04.2009, 13:55   #8
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Читать лучше согласно размеру кластера винта. Эдак по 4Кб или сколько у Вас там. По байту - жесть. Всё равно винт за раз прочитает целиком кластер, а не байт, а тут лишние обращения по кэшам идут.
вопрос - как это сделать? я в этом, так скажем, не очень шарю
Molotoff вне форума Ответить с цитированием
Старый 01.04.2009, 14:25   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну вероятно:
Код:
for (int i=0; i<n_func_p; i+=4096)
{
  fin.read((char*)&main_arr[i],4096);
  ...
}
и зачем Вам:
fin.seekg((i),ios::beg);
Каждую итерацию переходите туда, где уже находитесь. Какой в этом смысл?
pu4koff вне форума Ответить с цитированием
Старый 01.04.2009, 14:33   #10
Molotoff
Пользователь
 
Регистрация: 01.04.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Ну вероятно:
Код:
for (int i=0; i<n_func_p; i+=4096)
{
  fin.read((char*)&main_arr[i],4096);
  ...
}
и зачем Вам:
fin.seekg((i),ios::beg);
Каждую итерацию переходите туда, где уже находитесь. Какой в этом смысл?
проблема в том, что 4096 байт разом в переменную размером 1 байт не влезут
Molotoff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод имя файла Cdevelop Общие вопросы C/C++ 3 15.03.2009 12:42
Ввод из текстового файла bygoga Паскаль, Turbo Pascal, PascalABC.NET 14 23.11.2008 13:37
Ввод данных Илья Кибель Помощь студентам 1 28.05.2008 11:12
Соударение шариков разных размеров и объемов Стаханов_Андрей Помощь студентам 3 09.03.2008 17:17
Организовать ввод данных с файла созданного в первом задании и вывод их терминал. Saniok Помощь студентам 2 25.10.2007 22:25