Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.129.100] |
|
Сообщ.
#1
,
|
|
|
Бодрого дня, господа знатоки.
Придумал себе такую проблему - чтобы выборочно файл читать не как все, а потом выводить это на экран. А "загоняя" его построчно в массив и затем в нужный момент выводить необходимые строки (индексы массива). Так вот вопрос - целесообразно ли это при количестве строк больше 1 500? К стати, я сделал вот так: program proba; uses crt; var f: text; mas:array [1..25] of string; a,b,i:integer; begin repeat write('ввести а: '); readln(a); write('ввести b: '); readln(b); assign (f, 'inf.txt'); reset (f); for i:=1 to 25 do readln(f,mas[i]); for i:=a to b do writeln(mas[i]); close (f); until (a=0) or (b=0); end. Может и подскажете как это правильнее и красивее сделать? |
Сообщ.
#2
,
|
|
|
Цитата camac @ Может и подскажете как это правильнее и красивее сделать? Чтение в память - это прямое использование ресурсов. А если файл содержит 2Tb текста? В общем случае - лучше прочесть файл, но не загружать сами строки, а загружать их индексы. Грубо говоря, смещение n-ой строки от начала. Длина строки высчитывается как разница смещений n+1 (или конца файла) минус n. Но и тут следует учесть, и индексов может быть много, тогда писать их в индексный файл. Соответственно вывод нужной строки будет осуществлен в два этапа: бинарное чтение двух индексов по смещению + бинарное чтение самой строки. ... Но если в файле 15 строк, тогда не париться, а читать все в память. |
Сообщ.
#3
,
|
|
|
Я не совсем правильно свой оборзец написал. Или совсем неправильно...
По идее надо так: program proba; uses crt; var f: text; mas:array [1..25] of string; a,b,i:integer; begin assign (f, 'inf.txt'); reset (f); for i:=1 to 25 do readln(f,mas[i]); repeat write('ввести а: '); readln(a); write('ввести b: '); readln(b); for i:=a to b do writeln(mas[i]); close (f); until (a=0) or (b=0); end. Меня интересует - 3-4 тыс строк - это много или нет? Цитата лучше прочесть файл, но не загружать сами строки, а загружать их индексы. Грубо говоря, смещение n-ой строки от начала. Длина строки высчитывается как разница смещений n+1 (или конца файла) минус n. Но и тут следует учесть, и индексов может быть много, тогда писать их в индексный файл. А чуть подробней об этом узнать/почитать можно? Или Вы кратко объясните? |
Сообщ.
#4
,
|
|
|
А какая цель вообще стоит? И почему для реализации выбран турбопаскаль?
|
Сообщ.
#5
,
|
|
|
Цитата camac @ Меня интересует - 3-4 тыс строк - это много или нет? В нынешних реалиях используемой техники - это пыль. Расчет нехитрый. Берем самый бюджетный комп с 2Gb оперативы, со слегка "нафаршированной" виндой. Физической памяти там займется 1-1.2Gb. Мои сугубо личные наблюдения показывают, что винда начинает подтупливать, когда занимается 80% и более физической памяти. Таким образом, примерно 400Мб мы можем "откусить" под закачку строк. Если взять самые длинные паскалевско-родные строки, то получим 400*1024*1024/256 = 1 638 400 строки мы можем загрузить. Соответственно, ответ на вопрос 3-4к строк - это немного. Цитата camac @ А чуть подробней об этом узнать/почитать можно? Или Вы кратко объясните? Объясню на примере. Пусть дан текст c окончанием строк в формате DOS-Windows "перевод строки+возврат каретки" 0D0A: Мама мыла раму.(0d0a)Рама(0d0a)задолбала маму. ^....................^.........^.............. 0 17 23 Таким образом, считывая поблочно ищем все концы строк, строя индексный массив (грубо говоря - смещения строк относительно начала). Должен получиться такой (0,17,23). Теперь им пользуемся следующим образом ... |
Сообщ.
#6
,
|
|
|
Цитата MBo почему для реализации выбран турбопаскаль? Вообще то FreePascal. Турбо в Линуксе проблематичен. |
Сообщ.
#7
,
|
|
|
Думаю, во FreePascal-е есть TStringList. Для файлов умеренного размера (скажем, до сотни-другой мегабайт) это будет удобнее.
|
Сообщ.
#9
,
|
|
|
Цитата Так вот вопрос - целесообразно ли это при количестве строк больше 1 500? нет, не целесообразно |
Сообщ.
#10
,
|
|
|
Научным методом было бы задать количество строк переменной, и всю прогу писать относительно её, чтобы можно было бы меняя одно значение попробовать разные варианты. Можно даже локально порождать тестовые строки самой программой и смлтреть не станет ли работа некомфортной
|
Сообщ.
#11
,
|
|
|
Да, согласен. Сам так же делал
|