Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Вниз

чтение массива double с помощью TFileStream   Найти похожие ветки 

 
Ega23 ©   (2012-01-18 20:08) [40]


> Во-вторых, AssignFile-Reset-Read-CloseFile - это не сложный,
>  а, наверное, наоборот, самый простой способ чтения файла
> на Паскале.


1. Речь не о Паскале, а о Delphi 7. И  FileStream тут будет гораздо более удобней. И проще. В связи с этим


> Во-первых, я предлагаю не использовать "доводы" типа [32].


вкупе с [31] воспринимается смешно.


> В-третьих, при любом способе (сразу весь или кусками) будет
> буферизация, поэтому разница не должна быть большой


А ты возьми и проверь. На 10 миллионов значений. FileStream - 93 ms. Assign-Read-Close: 16708 ms
Разница не очень большая, всего в 180 раз. Буферизация, тем более... :)


 
Андреевич   (2012-01-18 20:38) [41]

c readln() вообще может получиться адски медленно ( http://forum.sources.ru/index.php?showtopic=326171&view=findpost&p=2848363 :) )


 
Самуилыч   (2012-01-18 21:01) [42]

> Ega23 ©   (18.01.12 20:08) [40]

Ты бы еще сотню миллиардов чисел взял. Речь идет о конкретной задаче -
и автор четко написал: миллион точек. По твоим же данным это примерно полторы секунды. Аффигительное время, да? Пару раз моргнуть успеешь.

В [25] сказано: "считывание происходит моментально". Что еще нужно?

Ничего. И не надо превращать оптимизацию в самоцель. Спорить тут не о чем.

> Андреевич  (18.01.12 20:38) [41]

А что, разве кто сомневался, что текстовый файл - это медленно?


 
Ega23 ©   (2012-01-18 21:16) [43]


> Ничего. И не надо превращать оптимизацию в самоцель. Спорить
> тут не о чем.


Где тут оптимизация-то? Абсолютно штатная операция.


> А что, разве кто сомневался, что текстовый файл - это медленно?


Если с умом, то вполне себе быстро.


 
Самуилыч   (2012-01-18 21:55) [44]

> Ega23 ©   (18.01.12 21:16) [43]

> Где тут оптимизация-то?
Вообще-то, как раз о ней речь с самого начала и идет. Еще с [0].

> Если с умом, то вполне себе быстро.
Не затруднит примерчег быстрого заполнения массива double из текстового файла?

------------

Я тут последовал твоему совету "возьми и проверь". Именно на 10 млн чисел. Вот мои результаты: FileStream - 125 ms. Assign: 62 ms.

Разница не очень большая, всего в 2 раза. Но почему-то в другую сторону. Что я (или не я?) делаю не так?


 
Jeer ©   (2012-01-18 22:13) [45]


> Что я (или не я?) делаю не так?


Число процессоров не учитываешь :)


 
Ega23 ©   (2012-01-18 22:28) [46]


> Я тут последовал твоему совету "возьми и проверь". Именно
> на 10 млн чисел. Вот мои результаты: FileStream - 125 ms.
>  Assign: 62 ms.


Можно код посмотреть?


> Вообще-то, как раз о ней речь с самого начала и идет. Еще с [0].


Я к тому, что "где здесь некая вычурная оптимизация"?


 
Ega23 ©   (2012-01-18 22:29) [47]


> Не затруднит примерчег быстрого заполнения массива double
> из текстового файла?


Формат текстового файла приведи, пожалуйста.


 
Jeer ©   (2012-01-18 22:49) [48]

Ну как, спецы, оптимизируем ?
Наиболее быстрый способ чтения текстового файла и парсинга в  дин. массив ?  
type
 TCoords = class
   X: double; Y: double
 end;

var
 arCoords: array of TCoords;

Число строк: >= 100 тыс и <= 10 млн.

Формат каждой строки файла - два числа в формате фиксированной точки.
+/-N.9N_+/-N.9N

"_" - символ "пробел" ( #32 )
+/- - знак  (плюс может отсутствовать)
N - цифровой символ
. - десятичная точка
9N - число цифровых символов, не более 9, но не менее 1.

Первое число - X, второе - Y.


 
Ega23 ©   (2012-01-18 22:52) [49]


> Jeer ©   (18.01.12 22:49) [48]

Треба уточнение:
1. ANSI или UNICODE?
2. Я правильно понял, что каждый экземпляр TCoords записано отдельной строкой?


 
Jeer ©   (2012-01-18 22:56) [50]

1. ANSI, какой на фик уникоде для чисел :)
2. Да, отдельная строка на (*x,*y)

Данные - предположительно шумовой процесс, т.е. число цифр после запятой с большой вероятностью будет именно 9 ( это просто для примера ).


 
Ega23 ©   (2012-01-18 23:11) [51]


> 1. ANSI, какой на фик уникоде для чисел :)


Файл-то текстовый...

Я правильно понял, что до запятой только одна цифра?


 
Dennis I. Komarov ©   (2012-01-18 23:30) [52]

Сорри за офф, навеяло:
ФаМиРеДоСольСоль :)


 
Самуилыч   (2012-01-18 23:31) [53]

> Ega23 ©   (18.01.12 22:28) [46]

> Можно код посмотреть?
Можно. Но после того, как скажешь, где я тебя обманул. Причем сразу говорю - я тебя действительно обманул, но не в цифрах, цифры совершенно реальные. И Assign, Reset - тоже без обмана, реально в коде использовал.

> Я к тому, что "где здесь некая вычурная оптимизация"?
Почему "вычурная"? Обычная оптимизация. Человек написал код, скорость его не устраивает, он спросил, как ускорить - это и есть оптимизация. Вся ветка о ней и есть.

> Ega23 ©   (18.01.12 22:29) [47]
> Формат текстового файла приведи, пожалуйста.

Снова ай-яй-яй. Ты отвечал на мой ответ на [41], а в [41] четко сказано - readln. Значит, формат очевиден - одно число в строке, в текстовом файле.


 
Jeer ©   (2012-01-18 23:35) [54]


> Я правильно понял, что до запятой только одна цифра?


Ну да.


 
Jeer ©   (2012-01-18 23:38) [55]

Я к тому, что если уж бодаться, то хотя бы на некоторой более-менее правдоподобно описанной и востребованной ситуации.
Надо было бы конечно ввести более широкое представление чисел, ну и я упростил, но и заложил "мину".

Вот  к чему был "изобретен" это тест.
Он с подвохом, т.к. содержит неявное указание на возможность оптимизации по размеру файла, если это конечно пригодится.


 
Jeer ©   (2012-01-18 23:50) [56]


> Снова ай-яй-яй.


Слов много, толку мало.
Не образовательно говоришь, а потому бесперспективно..


 
Inovet ©   (2012-01-18 23:51) [57]

> [55] Jeer ©   (18.01.12 23:38)
> т.к. содержит неявное указание на возможность оптимизации
> по размеру файла

В смысле на выделение памяти зараз по предположительному количеству чисел? Я сразу подумал как бы так её выделить чтобы не перевыделять потом и слишком много не хапнуть.


 
Самуилыч   (2012-01-19 01:14) [58]

Навскидку. Наверное, не самое лучшее, но первое, что пришло в голову.

Любая строка в файле не короче 9 символов : N.N_N.N CR LF
Значит, число строк в файле N не более: размер_файла / 9

Создаем TStringList и ставим ему Capacity = N
Потом LoadFromFile - получаем по 2 числа в строке и реальный Count.
Потом SetLength массиву.
Потом в цикле создаем и заполняем элементы массива.


 
Самуилыч   (2012-01-19 01:17) [59]


> Значит, число строк в файле N не более: размер_файла / 9
> Создаем TStringList и ставим ему Capacity = N

Здесь надо заменить N на M, иначе путаница.


 
Ega23 ©   (2012-01-19 01:19) [60]


> Можно. Но после того, как скажешь, где я тебя обманул.

детский сад.


 
Самуилыч   (2012-01-19 01:25) [61]

Вообще, можно еще помудрить с элементами массива.

Размер элемента известен: SizeOf(Pointer) + 2 * SizeOf(Double)
Число элеменов тоже известно (см. [58]).

Значит, можно разом выделить память одним экстентом под все элементы массива, а в цикле только заполнять их и проставлять в массив их адреса.


 
Самуилыч   (2012-01-19 01:30) [62]


> Ega23 ©   (19.01.12 01:19) [60]

Хех... дружище, ООП - штука отличная, но далеко не всегда самая эффективная. Потому что накладных расходов довольно много бывает.


 
Германн ©   (2012-01-19 01:33) [63]


> Inovet ©   (18.01.12 23:51) [57]
>
> > [55] Jeer ©   (18.01.12 23:38)
> > т.к. содержит неявное указание на возможность оптимизации
> > по размеру файла
>
> В смысле на выделение памяти

Вообще-то в задаче Jeer ©   (18.01.12 22:49) [48] об оптимизации памяти или о её перераспределении речи не было.


 
Ega23 ©   (2012-01-19 01:43) [64]


> ООП - штука отличная, но далеко не всегда самая эффективная.

А где тут ООП?


 
Самуилыч   (2012-01-19 01:53) [65]


> Ega23 ©   (19.01.12 01:43) [64]

Как? А твой любимый TFileStream - это разве не ООП?


 
Германн ©   (2012-01-19 01:54) [66]


> Ega23 ©   (19.01.12 01:43) [64]

Самиуилыч бредит, ибо это не родное для его время суток.
Он явно путает ООП с чем-то ещё.


 
Ega23 ©   (2012-01-19 01:57) [67]


> Как? А твой любимый TFileStream - это разве не ООП?

Честно говоря, я даже и не знаю что сказать.


 
Самуилыч   (2012-01-19 02:17) [68]

> Германн ©   (19.01.12 01:54) [66]

Купи книжку Архангелького и там прочти, что такое ООП. Потом приходи сдавать зачет.

> Ega23 ©   (19.01.12 01:57) [67]

Тогда поясню. ООП - это объектно-ориентированное программирование (выучи это наизусть). То есть, программирование с использованием объектов.

Ты использовал экземпляр класса TFileStream. А экземпляр класса есть объект (это тоже выучи наизусть). Значит, ты использовал объект.

Теперь вспомни, что программирование с использованием объектов сокращенно называется ООП. Значит, использовав класс TFileStream, ты тем самым применил ООП.

И расскажи все это Германну, чтобы ему на Архангельского не тратиться.


 
Германн ©   (2012-01-19 02:27) [69]


> Самуилыч   (19.01.12 02:17) [68]
>
> > Германн ©   (19.01.12 01:54) [66]
>
> Купи книжку Архангелького и там прочти, что такое ООП. Потом
> приходи сдавать зачет.

Даже в полном бреду, я себе никак не представляю, что буду сдавать зачёт по Архангельскому. Лучше уж сразу пойти в дворники!


 
Германн ©   (2012-01-19 02:32) [70]


> Самуилыч   (19.01.12 02:17) [68]
>
> > Германн ©   (19.01.12 01:54) [66]

Пардон. Я не оценил вашего юмора.
Но оценил вашу "анонимность"!
Предпочту теперь ваши высказывания не учитывать.


 
Самуилыч   (2012-01-19 02:40) [71]

> Jeer ©   (18.01.12 22:49) [48]

С выделением памяти вроде разобрались, теперь что касается оптимизации работы с файлом. Тоже навскидку - первое, что пришло в голову.

Число строк в файле: не более 10 млн.
Строки ANSI.
Длина каждой строки: не более 27 байт (-N.9N_-N.9N CR LF)
Значит, размер файла не более 270 млн. байт (257 Мб с копейками)

Это позволяет замаппить файл (памяти должно хватить) и далее работать с ним, как с памятью - просто двигая указатель. Быстрее вряд ли придумаешь.


 
Самуилыч   (2012-01-19 02:43) [72]


> Германн ©   (19.01.12 02:32) [70]

Извини, если что. Просто [66] ты зря написал.

Ладно, проехали. Предлагаю мир, дружбу, жвачку. И пиво, само собой.


 
Германн ©   (2012-01-19 02:47) [73]


> Самуилыч   (19.01.12 02:43) [72]
>
>
> > Германн ©   (19.01.12 02:32) [70]
>
> Извини, если что. Просто [66] ты зря написал.
>
> Ладно, проехали. Предлагаю мир, дружбу, жвачку. И пиво,
> само собой.
>

Пиво я не пью!
Если речь только о пиве - то проехали.


 
Inovet ©   (2012-01-19 09:39) [74]

> [71] Самуилыч   (19.01.12 02:40)
> Это позволяет замаппить файл (памяти должно хватить)

А при чём тут "памяти хваить"? Какая память имеется ввиду?


 
Jeer ©   (2012-01-19 10:26) [75]


> Самуилыч   (19.01.12 02:40) [71]
..
> Быстрее вряд ли придумаешь.


Код, давай код и тесты - теоретиков и так много на свете, а тут глядишь кому-то поможем с реальной задачей :)


 
Самуилыч   (2012-01-19 10:45) [76]


> Inovet ©   (19.01.12 09:39) [74]

Если я правильно понимаю, то для замапливания файла в адресном пространстве процесса нужно зарезервировать соответствующий диапазон адресов, причем этот диапазон не может превышать свободную память.

А если я понимаю неправильно, то пусть меня поправят. Не обижусь, еще и спасибо скажу.


 
Самуилыч   (2012-01-19 10:50) [77]

> Jeer ©   (19.01.12 10:26) [75]
> Код, давай код и тесты - теоретиков и так много на свете,
>  а тут глядишь кому-то поможем с реальной задачей :)

Эва... код давай... это ж писать надо, часа 2-3 уйдет, не меньше. А работать за меня Пушкин будет?

Вообще-то, я бы с удовольствием, но не поймут-с... да и Пушкина под рукой нет.

Так что поимку ручного льва в пустыне Сахара придется оставить читателю в качестве самостоятельного упражнения.


 
Inovet ©   (2012-01-19 11:29) [78]

> [76] Самуилыч   (19.01.12 10:45)
> причем этот диапазон не может превышать свободную память.

Это неправильно.

И вообще сомнительно для последовательного чтения. Короче
> [75] Jeer ©   (19.01.12 10:26)
> Код, давай код и тесты


 
Самуилыч   (2012-01-19 12:26) [79]


> Inovet ©   (19.01.12 11:29) [78]

Почему неправильно? Процессу выделяется 4Гб памяти, из них нам доступны нижние 2 Гб (кроме самых нижних 64 Кб, но сейчас это неважно). Допустим, в какой-то момент мы использовали эти 2 Гб почти полностью, осталось 1 Мб. И тут мы патаемся замаппить файл размером 5 Мб, причем все 5 Мб в CreateFileMapping и указываем. А свободных адресов для этого нет - получаем ошибку.

Что тут не так?


 
Самуилыч   (2012-01-19 12:34) [80]

Хотя можно и проще - выделить буфер, равный размеру файла и засосать в него весь файл разом, как советовал Ega23. А потом парсить его, двигая указатель от пробела к пробелу.



Страницы: 1 2 3 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.008 c
15-1326313802
Юрий
2012-01-12 00:30
2012.05.20
С днем рождения ! 12 января 2012 четверг


2-1326795550
illiya
2012-01-17 14:19
2012.05.20
Method identifier expected


1-1291970624
mnj
2010-12-10 11:43
2012.05.20
Выбор точек, веток и и х движение в TChart


15-1326447033
aka
2012-01-13 13:30
2012.05.20
SSH+Delphi


2-1326881105
u4enik
2012-01-18 14:05
2012.05.20
помогите разобраться с указателями





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский