Форум » [x]Harbour » Разделить файл » Ответить

Разделить файл

rvu: Есть большой текстовый файл, нужно его поделить по числу строк. Например, кусками по 10 000 строк. Или по 100 000. Есть способ? Понятно, что можно искать CHR(13)+CHR(10) и отрезать по кусочку, но как-то очень это долго. Причем, длительность еще не самая большая проблема.

Ответов - 28, стр: 1 2 All

Andrey: rvu пишет: Может быть, позднее попробую способ Андрея, тоже интересно. Я не знаю, можно ли в переменную загнать 10 Гб ( я так понял это размер файла) ? [pre2]cTxt := HB_Memoread("имя и путь к файлу")[/pre2] До 1 Гб делал. Нужно пробовать.

rvu: Andrey пишет: Я не знаю, можно ли в переменную загнать 10 Гб ( я так понял это размер файла) ? У меня не получилось. Я выше писал об этом.

Andrey: Всем привет ! Просто интересно: 1) Какая максимальная текстовая строка может быть в Харборе ? 2) Какой максимальный размер одномерного массива может быть в Харборе ?


Pasha: Ограничение длины строки для Harbour 32-bit - 4Г, размер массива соответственно 4 млрд элементов. С хвостиком, естественно. Для Harbour 64-bit - это 2^64 байт, или элементов. Это какие-то там сумасшедшие эксибайты, где-то 10 в 20й степени. Но даже выделять гигабайты в программе крайне не рекомендуется. Если и хватит виртуальной памяти, это не будет способствовать стабильной работе OS. Выделять такой объем памяти под массив строк еще хуже, чем для одной строки, так как памяти понадобится больше. Для работы с таким огромным массивом строк (если строка в среднем 50 байт, это будет 200 млн.строк) лучше сделать таблицу, можно и dbf, с полем скажем типа Variant (это разновидность memo). Сформировать эту таблицу, и ползать по ней, не перенапрягая несчастную операционную систему гигантскими запросами.

rvu: Pasha пишет: Но даже выделять гигабайты в программе крайне не рекомендуется. Если и хватит виртуальной памяти, это не будет способствовать стабильной работе OS. У меня есть еще одна задача, где я файл размером немного больше гига делю по строчкам. Компьютер с 4 гигами оперативки нормально к такому относится.

PSP: rvu пишет: У меня есть еще одна задача, где я файл размером немного больше гига делю по строчкам. Компьютер с 4 гигами оперативки нормально к такому относится. Может незаметно настать момент, когда файл будет гораздо больше и ОС им подавится. Присоединюсь к Павлу, лучше использовать dbf.

Pasha: Вот именно. У меня как раз комп с 4Г Для harbour 32-bit выдаю space(1000000000) секунда задержки, и запрос выполняется а для space(2000000000) программа сначала задумывается на несколько секунд, а затем вываливается с ошибкой 9006, хоть предел размера строки на 4Г не превышен. ОС не смогла выполнить запрос. А может выполнить, но другая задача захлебнется от нехватки памяти. Дополню: все это касается 64-битной ОС. Для 32-битной дело обстоит еще печальнее.

Pasha: Берем Harbour-64, ОС и комп тот же: win7-64 и 4G RAM запрашиваем space(1000000000) Без проблем, одна секунда - и все в порядке. Поднимаем ставки space(2000000000) space(3000000000) 10-15 секунд задержки, но система справляется. Идем на рекорд: space(4000000000) Программа "виснет" на несколько минут, ОС тоже, индикатор диска бешено мигает, но в конце концов запрос выполняется. Затем пару минут ОС ведет себя несколько задумчиво и глючно, видимо, освобождает выделенную память. В конце концов работоспособность восстанавливается. Дальше пробовать не стал. Повторюсь: огромные объемы памяти запросить можно, но делать это не стоит. Это как участвовать в соревновании: кто больше скушает водки пельменей. Победить можно, но можно и помереть.



полная версия страницы