|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
01.04.2009, 07:47 | #1 |
Пользователь
Регистрация: 01.04.2009
Сообщений: 20
|
Ввод больших объемов данных из файла
Добрый день
У меня следующая ситуация - нужно считывать большие объемы данных (1-2 Гб) в массив из файла, файл бинарный, все значения идут подряд без пробелов и разделителей, консольное приложение. Сейчас это реализовано следующим образом: Код:
Заранее благодарен. |
01.04.2009, 10:19 | #2 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
То есть, получается у вас программа "кушает" 1-2Гб оперативной памяти? Не самый лучший подход. Может стоит сделать запись этого массива в другой, временный, файл, и работать потом с ним?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
01.04.2009, 10:33 | #3 |
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
2Molotoff если работаешь винде, почитай про отображение файлов в память (file mapping). и не надо целиком считывать такой огромный файл. все зависит от того, что ты будешь делать с информацией, которая находится в этом файле.
|
01.04.2009, 12:24 | #4 |
Пользователь
Регистрация: 01.04.2009
Сообщений: 20
|
программа для научных расчетов, поэтому хранить такой массив просто жизненная необходимость, т.е. надо 2^32 итераций обращаться к файлу, а это долго, нужно чтоб обсчет происходил быстро, поэтому нужно, чтоб все хранилось в оперативке.
2vvviperrr - да работаю в винде, случаем ссылок под рукой нет про эту тему? буду очень признателен |
01.04.2009, 12:33 | #5 |
Пользователь
Регистрация: 01.04.2009
Сообщений: 20
|
И еще, описанным выше способом в память считывались 280 Мб в течении получаса, я считаю - это очень долго, поэтому и спрашиваю как можно этот процесс ускорить
|
01.04.2009, 12:57 | #6 | ||
Тупой студент
Форумчанин
Регистрация: 12.05.2007
Сообщений: 614
|
Цитата:
Цитата:
|
||
01.04.2009, 13:34 | #7 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Читать лучше согласно размеру кластера винта. Эдак по 4Кб или сколько у Вас там. По байту - жесть. Всё равно винт за раз прочитает целиком кластер, а не байт, а тут лишние обращения по кэшам идут.
|
01.04.2009, 13:55 | #8 |
Пользователь
Регистрация: 01.04.2009
Сообщений: 20
|
|
01.04.2009, 14:25 | #9 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Ну вероятно:
Код:
fin.seekg((i),ios::beg); Каждую итерацию переходите туда, где уже находитесь. Какой в этом смысл? |
01.04.2009, 14:33 | #10 |
Пользователь
Регистрация: 01.04.2009
Сообщений: 20
|
проблема в том, что 4096 байт разом в переменную размером 1 байт не влезут
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ввод имя файла | 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 |