Проблема с открытием файла большого размера
-
- interested
- Сообщения: 6
- Зарегистрирован: 09 сен 2009, 16:04
- Версия LabVIEW: 8.5
- Контактная информация:
Проблема с открытием файла большого размера
Здравствуйте, у меня проблема:
Пишу бинарный файл непосредственно с АЦП (80 кГц - 4 канала) больше минуты. Размер порядка 200-300 МБ, иногда до 700 МБ. Если файл меньше, то открывается нормально, если больше, то при открытии выдает ошибку, что не хватает памяти.
1) Подскажите как это можно обойти?
2) Есть ли какое ограничение на размер открываемого файла, если есть, то какое? И нельзя ли открывать файл "частями"?
3) Можно ли при сохранении файла автоматически при превышении его размера, не прерывая запись, создать новый файл и писать уже туда? (т.е. контролировать его размер)
Заранее спасибо.
Пишу бинарный файл непосредственно с АЦП (80 кГц - 4 канала) больше минуты. Размер порядка 200-300 МБ, иногда до 700 МБ. Если файл меньше, то открывается нормально, если больше, то при открытии выдает ошибку, что не хватает памяти.
1) Подскажите как это можно обойти?
2) Есть ли какое ограничение на размер открываемого файла, если есть, то какое? И нельзя ли открывать файл "частями"?
3) Можно ли при сохранении файла автоматически при превышении его размера, не прерывая запись, создать новый файл и писать уже туда? (т.е. контролировать его размер)
Заранее спасибо.
-
Konstantin Sumenko
- expert
- Сообщения: 1439
- Зарегистрирован: 17 июл 2008, 12:20
- Награды: 2
- Версия LabVIEW: 2010
- Откуда: Moscow
- Поблагодарили: 1 раз
- Контактная информация:
Re: Проблема с открытием файла большого размера
Ошибка при открытии или при непосредственном чтении из него?
По 3 пункту: можно. Ведешь учет размера файла (либо VI Get File Size, либо накапливаешь кол-во записанных байт), по превышению закрываешь используемый файл и открываешь новый но с другим именем- далее пишешь в него.
По 3 пункту: можно. Ведешь учет размера файла (либо VI Get File Size, либо накапливаешь кол-во записанных байт), по превышению закрываешь используемый файл и открываешь новый но с другим именем- далее пишешь в него.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: Проблема с открытием файла большого размера
Чтение по частям было бы самое правильное. При чтении файла используй Set File Position, это что то вроде курсора-метки.
Ограничения нет, кроме размера RAM конечно
Ограничения нет, кроме размера RAM конечно
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Увы, ограничения все-таки есть. Оказывается нельзя создать массив любой длины, есть ограничение на кол-во элементов в массиве. Столкнулись с этим недавно, и убедились что проблема глобальная, то есть и в Delphi и СИ возникали исключения при создании огромного массива в виде: stack owerflow... Так что иногда LabVIEW может дать "не хватает памяти" занимая в памяти 400Мб, а иногда при 1,5 ГГб.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Проблема с открытием файла большого размера
Delphi и С помещают некоторые структуры данных на стек. Это значит, что большие структуры данных нужно создавать в куче (heap). Но вроде бы должна как-то динамически перераспределять между стеком и кучей. Мне казалось, что на стек попадает только Handle сложной структуры (а то и указатель на handle), а сама структура идёт в кучу. toto, можешь привести воспроизводимый пример?
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
Re: Проблема с открытием файла большого размера
Куча - не резиновая и может закончиться.mzu2006 писал(а):Мне казалось, что на стек попадает только Handle сложной структуры (а то и указатель на handle), а сама структура идёт в кучу.
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Выкладываю пример:
- Вложения
-
- тест массива.vi
- (11.78 КБ) 178 скачиваний
-
crashwork
- adviser
- Сообщения: 205
- Зарегистрирован: 17 фев 2009, 19:57
- Награды: 2
- Версия LabVIEW: 8.5, 9.0
- Откуда: Украина. Кременчуг
- Контактная информация:
Re: Проблема с открытием файла большого размера
В общем я тестил так.
1. Сначала протестил на одномерном массиве размером 10 млн, тип данных unsigned int8. По расчетной формуле размер занимаемого массива = 9,5 Мб. Однако в диспетчере задач приложение labview стало занимать на 30 Мб больше, то же самое показал и профайл.
2. При таком раскладе пример "тест массива" при 150-миллионном массиве отъел у меня около 470 метров оперативки (в диспетчере задач столько стало занимать приложение LabVIEW) после чего лаганул. На тот момент у меня цитирую "доступная физическая память" = 510 Мб.
Так что все закономерно, вот только почему массивы так много занимают? Что еще сохраняется в памяти помимо значений массива?
1. Сначала протестил на одномерном массиве размером 10 млн, тип данных unsigned int8. По расчетной формуле размер занимаемого массива = 9,5 Мб. Однако в диспетчере задач приложение labview стало занимать на 30 Мб больше, то же самое показал и профайл.
2. При таком раскладе пример "тест массива" при 150-миллионном массиве отъел у меня около 470 метров оперативки (в диспетчере задач столько стало занимать приложение LabVIEW) после чего лаганул. На тот момент у меня цитирую "доступная физическая память" = 510 Мб.
Так что все закономерно, вот только почему массивы так много занимают? Что еще сохраняется в памяти помимо значений массива?
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Не совсм понял, что закономерно, у меня 3 Гига оперативки в компе. Размер массива из примера - 270Мб. При снятии Disable окна, LabVIEW при выполнении примера дает сообщение: Not enouth memory to complite this operation. После ОК - LabVIEW: Memory is full.
Сейчас в своем примере выкинул индикатор массива, вместо него нарисовал Sequence окно и выход Initialize Array завел на Sequence. В таком варианте VI сработала, но при попытке поставить Probe на провод от инициализации до пустого окна таже ошибка.
В любом случае, вывод один, существует ограничение на кол-во элементов в массиве или на его размер, не зависяцее от количества оперативной памяти.
Сейчас в своем примере выкинул индикатор массива, вместо него нарисовал Sequence окно и выход Initialize Array завел на Sequence. В таком варианте VI сработала, но при попытке поставить Probe на провод от инициализации до пустого окна таже ошибка.
В любом случае, вывод один, существует ограничение на кол-во элементов в массиве или на его размер, не зависяцее от количества оперативной памяти.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Проблема с открытием файла большого размера
Очень интересная тема, toto. Мне кажется, дело здесь в фрагментации памяти. Вот мои доказательства:
1. Сейчас я испытываю этот на своём лаптопе. У меня 2Гб, вертится немало программ. Свободно около гига. Запускаю твой пример. Больше ~325Мб не выделить.
2. А если пойти другим путём: вместо двумерного массива сделать массив кластеров одномерных массивов. Тогда, одномерные, небольшие массивы не должны все в месте лежать в одной непрерывной области памяти.
проверяем: смог выделить 1 Гб, дальше не пробовал, система ушла в swap. Вот мой пример:
1. Сейчас я испытываю этот на своём лаптопе. У меня 2Гб, вертится немало программ. Свободно около гига. Запускаю твой пример. Больше ~325Мб не выделить.
2. А если пойти другим путём: вместо двумерного массива сделать массив кластеров одномерных массивов. Тогда, одномерные, небольшие массивы не должны все в месте лежать в одной непрерывной области памяти.
проверяем: смог выделить 1 Гб, дальше не пробовал, система ушла в swap. Вот мой пример:
- Вложения
-
- ArrayTest.vi
- (9.87 КБ) 164 скачивания
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Да, проверяли даже на просто одномерном массиве, если выделить одномерный массив с количеством элементов равным произведению размерности двумерного массива, то такой проблемы нет. Одномерный массив можно инициализировать с большим числом элементов чем двумерный.
-
mzu2006
- doctor
- Сообщения: 2456
- Зарегистрирован: 16 авг 2008, 02:12
- Награды: 3
- Версия LabVIEW: 7.1 10 11 12
- Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
- Контактная информация:
Re: Проблема с открытием файла большого размера
Дело не в одномерности/двумерности а в том как хранит в памяти сложные структуры.
Но когда ты вместо массива выделяешь массив кластеров, состоящих из более мелких массивов, то давай посмотрим как выделяется пямть в этом случае:
во первых, выделяется кусок памяти под массив handles на кластера. непрерывный кусок памяти, 4 байта на handle.
во-вторых, на каждый массив, являющийся элементом кластера тоже выделяется своя область, непрерывная, но гораздо меньшего размера чем 1 большой. Т.е. теперь фрагментация памяти нам не помеха.
PS. Выделение 1 гб под двумерный массив кластеров из массивов прошёл также хорошо, как и под одномерный с тем же числом элементов.
Но когда ты вместо массива выделяешь массив кластеров, состоящих из более мелких массивов, то давай посмотрим как выделяется пямть в этом случае:
во первых, выделяется кусок памяти под массив handles на кластера. непрерывный кусок памяти, 4 байта на handle.
во-вторых, на каждый массив, являющийся элементом кластера тоже выделяется своя область, непрерывная, но гораздо меньшего размера чем 1 большой. Т.е. теперь фрагментация памяти нам не помеха.
PS. Выделение 1 гб под двумерный массив кластеров из массивов прошёл также хорошо, как и под одномерный с тем же числом элементов.
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Да, так я и не спорю :) Похоже, причина как раз в непрерывном выделении куска памяти, а с фрагментацией эта проблема уходит.
Re: Проблема с открытием файла большого размера
С этим трудно поспорить. Вдобавок народ на форумах поговаривает что в LV есть ограничение по размерности непрерывного массива в 1 гиг. Жаль, но похоже нет возможности определить максимальный размер блока выделяемой памяти который можно получить под свои нужды - DSMaxMem в винде не работает.
-
- professional
- Сообщения: 390
- Зарегистрирован: 07 мар 2008, 09:26
- Награды: 3
- Версия LabVIEW: 6i-16
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Проблема с открытием файла большого размера
Интересно, а в СИ нет такого ограничения разве? Мои ощущения подсказывают, что эти ограничения связаны не с самим LV а с СИ, как основой на которой и LV написан, а может даже глубже - с ОС.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение