PDA

Просмотр полной версии : [Delphi] Большие таблицы данных


peacefully
13.01.2010, 14:28
Хая всем. Прошу советов.

Надо строить, выводить на форму, редактировать, сохранять в файл, загружать из этого файла бооооооольшущую матрицу. Скажем, 1кк строк/столбцов.

Че-то смутные сомнения насчет СтрингГрида, хоть пока и не проверял..

Если кто-то сталкивался с большими таблицами, подскажите, плиз, изящные методы. Упор на удобство хранения.

Спасибо)

alexteam
13.01.2010, 14:31
абсолютдб. опять же.

peacefully
13.01.2010, 17:04
О.. Но это как картошку копать экскаватором. Надо просто структуру сохранять, открывать, на экран выводить, типа такого:
1 0 0 1 0
0 0 1 1 1
1 1 0 1 0
0 1 0 0 1
0 1 1 1 0
Только с размерностью в лям.

СтрингГрид (2м мощность держит.. посмарел) и эрей оф эрей оф бит, который в типизированный файл загнать ведь можно?..

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

alexteam
13.01.2010, 18:08
матрица из лабл\едитов по размеру отображения на экране, 2 скрулбара и тфайлстрим.

peacefully
14.01.2010, 01:19
Напишу в общество защиты лейбл-едитов..))

finomen
14.01.2010, 22:53
10^6*10^6=10^12. если по байту на элемент то это почти Тб табличка. если юзать биты то 250Гб. может я что-то не так понял?

peacefully
15.01.2010, 20:16
А что тут не так можно понять?)) Табличка не самая маленькая)) Вот ее как-то надо хранить.

finomen
15.01.2010, 21:29
где, стеснябсь спросить? на харде? тогда можно реализовывать инетрфейс как угодно. время обращения огромное. для ускорения-пихать в буфер табличку чуть больше чем видимая часть. хотя, смотря на какой машине. если это суперкомпьютер то можно и в оперативку)

peacefully
16.01.2010, 13:17
На хардеее... Я видел здоровенные таблицы, но весили меньше, чем если так рассчитывать)

alexteam
16.01.2010, 13:20
время обращение не такое уж и большой.
никто не заставляет читать весь файлстрим. можно просто двигать позицию чтения с файлстрима в те места которые требуется отобразить.

finomen
16.01.2010, 17:25
а ты уверен что тебе оно надо? может можно и без такой демонической таблицы....

peacefully
16.01.2010, 18:04
Хочу АЦЦКОЕ ГИГАБИТНОЕ ТАБЛИЧКО!!!1раз

finomen
16.01.2010, 18:59
я понимаю, что встречаются задачи по обработке и терабайтных матриц....но это очень специфические задачи и решаются они не на PC...

peacefully
17.01.2010, 14:24
На самом деле задача сначала сгенерить табличко максимально-какого-получится-размера, а потом просчитать ее.

Добавлено через 5 часов 47 минут
const N = 65534;
var A: array[0..N,0..N] of Boolean;
Если N на единицу больше - Data type too large: exceeds 2 GB

Delphi 7.

Печаль(

finomen
17.01.2010, 17:05
думаю 64 битная система позволит сожрать побольше памяти. но не 200Гб.

xkor
17.01.2010, 17:44
peacefully, на 32битной системе массив не может быть размером больше 2 гигабайт так как индекс имеет тип Integer для которого максимальное значение - 2 гигабайта

finomen, дельфи пока не поддерживает 64бита, но в теории там размер массива может быть более 7 эксабайт (ну или более 8 000 000 терабайт)

peacefully
17.01.2010, 18:26
Еще более печально то, что табличко кусками необрабатываемоабельная.. ЖЖЖАЛЬ!

Добавлено через 7 минут
peacefully, на 32битной системе массив не может быть размером больше 2 гигабайт так как индекс имеет тип Integer для которого максимальное значение - 2 гигабайта

Точно. Не подумал об этом..

Таблица симметрична относительно диагонали.. матрица такая. А если замутить структуру типа массива 1-мерных массивов для верхне-/нижнедиагональной матрицы..A[0]: 0 1 0 0 1 ...
A[1]: 0 1 1 1 ...
A[2]: 0 0 1 ...
A[3]: 1 1 ...
A[4]: 0 ...

finomen
17.01.2010, 18:30
мути. тогда сможешь в раза больше сделать)

alexteam
17.01.2010, 20:39
пихай все в файлстрим. и представляй его в виде матрицы.
написано от балды:
где-то обявление и открытие fs : tfilestream;

Function GetCellValue(x,y:integer):boolean;
begin
fs.position := round(x*sqrt(fs.size)+y);
fs.read(result,1);
end;
Procedure SetGetCellValue(x,y:integer; value:boolean);
begin
fs.position := round(x*sqrt(fs.size)+y);
fs.write(value,1);
end;

Xa4ik
20.01.2010, 11:34
делфа она нубская.
тип булеан реально занимает 1 байт по умолчанию. физически можно впихнуть 8 булеанов в 1 байт.
если компилятор некушает масив[65к х 65к] чей сумарный индес выходит за 2^32, в сях прокатывает масив[][] тоесть масив масивов.
если матрица симетрическая, то при таких размерах ее нужно хранить в десятке линейных масивов, без излишеств в хранимой структуре.

alexteam
20.01.2010, 11:46
Xa4ik, а ничо что большинство прог на этом портале на делфе написаны ? не ? %)

finomen
20.01.2010, 12:51
C++ предоставляет гораздо больше возможностей для реализации извращенных мыслей, но дельфи позволяет забить на извращенные мысли, т.к. все написано до нас. Лично мой выбор С++, а если надо ченить с красивым окошечком-то можно заюзать qt.

ЗЫ делфи это почти паскаль, а последний создавался не как полноценный язык, а как средство обученя студентов программированию.

alexteam
20.01.2010, 13:11
там где есть зарезервированное слово asm - уже можно все.
холливар ? %)

xkor
20.01.2010, 17:28
если компилятор некушает масив[65к х 65к] чей сумарный индес выходит за 2^32, в сях прокатывает масив[][] тоесть масив масивов.а в дельфи типа нет массива массивов?)
как жешь я блин использую на дельфи 5тимерный динамический массив в снифере айона)))
С++, а если надо ченить с красивым окошечком-то можно заюзать qt.
вот только не надо сравнивать дельфи с его тысячами (даже десятками тысяч) компонентов с qt в котором компоненты хоть и крутые но не особо мнообразные, и вообще основное назначение qt - кросплатформенность...
ЗЫ делфи это почти паскаль, а последний создавался не как полноценный язык, а как средство обученя студентов программированию.в дельфи от паскаля только синтаксис и самые основные ключевые слова, дельфи от паскаля намного дальше ушел чем С++ от С
там где есть зарезервированное слово asm - уже можно все.+1

finomen
20.01.2010, 18:51
согласен, что холивар, но не совсем. есть ряд задач, которые не решаемы на делфи/паскале/яве и иже с ними в виду нехватки ресурсов. слишком тяжеловесны они и медлительны. остаются C и asm, но последний для совсем мазахистов.

xkor
20.01.2010, 18:56
finomen, пример задачи не решаемой на дельфи в студию

finomen
20.01.2010, 21:28
одна описана выше. делфи еще не подружился с x64 системой
вторая - написание драйверов. не написано ддк для паскаля.

alexteam
20.01.2010, 21:53
неужели ? табличку в памяти ? точна низзя ? меняем файлстрим на мемористрим... и это.. получаем херню ограниченую по длинне инт64.
http://coderx.ru/showpost.php?p=58279&postcount=19
а по поводу драйверов, туча манов и примеров, и даже книги пишут. а ктото говорит что лыжи не едут... ужас...

и еще раз говорю. там где есть асм - есть все. реализация и подход отличается. так что зояву с "нереализуемо" можешь засунуть себе... э.. пардон.. дети...

finomen
20.01.2010, 22:20
асм не означает что это позволяет язык. на С все пишеться без вставок, последние нужны только для ускорения.
а фаилстрим и мемористрим в таких задачах...это костыли...а не способ реализации.
майкрософт любит заявлять "это не баг, это фича", но не стоит им уподобляться

alexteam
21.01.2010, 00:02
знал бы ты хоть один язык достаточно хорошо не утверждал бы так -))
имхо

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

peacefully
21.01.2010, 15:10
Ну вы еще подеритесь)

Лично я привык разделять задачи по тому, где их проще решить. Чаще всего Delphi хватает с головой, как бы его не критиковали.

finomen
21.01.2010, 23:12
делфи создан для работы с базами данных, в этом он однозначно выигрывает. Много удобных, хорошо отлаженных и оптимизированных компонент. Но делфи слишком высокоуровневый язык.

ЗЫ по теме
Language Comparison! (Ted Dennison)

I run across these lists everywhere. Unfortunately, they all seem to have been done by some brain-damaged soul who thinks C is a "normal" language. So I have made an attempt to come up with a new list that is a little more accurate, at least where I sit.

Ada :
You aim at your foot and pull the trigger, but the safety stops the gun from firing. The safety won't budge until you tag your foot with a sign reading "Bullet Hole in this foot", and call the paramedics. You do so, then shoot yourself in the foot.

C :
The gun comes in 38 pieces, with a set of assembly instructions. After painstakingly assembling the pieces, you pull the trigger and the gun promptly backfires and blows your head off.

Assembly :
The same as C, except you have to hand-machine all the pieces as well. When you pull the trigger, your whole house explodes.

Java:
You break into someone else's home and steal their water pistol. You then make a child gun that uses .38 rounds instead of water. When you pull the trigger on the child gun, nothing happens to you, but everyone who visits your house gets shot in the foot.

Basic :
You aim the gun at a straight horizontal and pull the trigger, which causes a stream of water to be squirted straight down onto your foot.

Pearl :
You aim the gun at your foot and pull the trigger. There is no explosion, but gravity causes the bullet to slide out of the barrel and bounce off your foot.

Lisp :
You do a small part of the remaining work involved in shooting yourself in the foot. You then call yourself, and tell yourself to shoot yourself in the foot.

Pascal :
The same as Ada, except when you pull the trigger a little sign pops out reading "BANG!".

C++ :
The same as Java, except you try to build the parent water pistol using the gun tools from the C gun. When you pull the trigger on the child gun, the parent C gun explodes, spraying water everywhere, including the chamber of the child gun. This causes the child gun to backfire, blowing your head off.

Visual C++ :
The same as C++, except that the bullets, the gun parts, the tools you use to put it together, the hospital you get taken to afterwards, and the ambulance that takes you there are all owned by the same company.

APL :
Whenever you pull the trigger, no matter where you aim the gun, the bullet ricochets off of 13 objects and lodges in your foot. The gun has been examined by ballistics experts, mechanical engineers, and even the person who made it, and none of them can figure out how it works.

FORTRAN :
When you aim the gun at your foot and pull the trigger, a table indexing error causes the gun to shoot its firing pin into your foot instead of the bullet.

alexteam
22.01.2010, 00:13
Не вижу сабжа.

finomen
22.01.2010, 00:30
по теме холивара.....вот более полная версия. все особенности языков хорошо описаны)
The proliferation of modern programming languages (all of which seem to have stolen countless features from one another) sometimes makes it difficult to remember what language you’re currently using. This guide is offered as a public service to help programmers who find themselves in such dilemmas.

C
You shoot yourself in the foot.

C++
You accidentally create a dozen clones of yourself and shoot them all in the foot. Providing emergency medical assistance is impossible since you can’t tell which are bitwise copies and which are just pointing at others and saying, “That’s me, over there.”

JAVA
After importing java.awt.right.foot.* and java.awt.gun.right.hand.*, and writing the classes and methods of those classes needed, you’ve forgotten what the hell you’re doing.

Ruby
Your foot is ready to be shot in roughly five minutes, but you just can’t find anywhere to shoot it.

PHP
You shoot yourself in the foot with a gun made with pieces from 300 other guns.

ASP.NET
Find a gun, it falls apart. Put it back together, it falls apart again. You try using the .GUN Framework, it falls apart. You stab yourself in the foot instead.

SQL
SELECT @ammo:=bullet FROM gun WHERE trigger = ‘PULLED’;
INSERT INTO leg (foot) VALUES (@ammo);

Perl
You shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. (via Andy)

Javascript
YOu’ve perfected a robust, rich user experience for shooting yourself in the foot. You then find that bullets are disabled on your gun.

CSS
You shoot your right foot with one hand, then switch hands to shoot your left foot but you realize that the gun has turned into a banana.

FORTRAN
You shoot yourself in each toe, iteratively, until you run out of toes, then you read in the next foot and repeat. If you run out of bullets, you continue anyway because you have no exception-handling ability.

Modula2
After realizing that you can’t actually accomplish anything in this language, you shoot yourself in the head.

COBOL
Using a COLT 45 HANDGUN, AIM gun at LEG.FOOT, THEN place ARM.HAND.FINGER. on HANDGUN.TRIGGER and SQUEEZE. THEN return HANDGUN to HOLSTER. CHECK whether shoelace needs to be retied.

LISP
You shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds the gun with which
you shoot yourself in the appendage which holds ….

BASIC
Shoot yourself in the foot with a water pistol. On big systems, continue until entire lower body is waterlogged.

FORTH
Foot in yourself shoot.

APL
You shoot yourself in the foot, then spend all day figuring out how to do it in fewer characters.

Pascal
The compiler won’t let you shoot yourself in the foot.

SNOBOL
If you succeed, shoot yourself in the left foot.
If you fail, shoot yourself in the right foot.

Concurrent Euclid
You shoot yourself in somebody else’s foot.

HyperTalk
Put the first bullet of the gun into the foot of the left leg of you.
Answer the result.

Motif
You spend days writing a UIL description of your foot, the trajectory, the bullet, and the intricate scrollwork on the ivory handles of the gun. When you finally get around to pulling the trigger, the gun jams.


Unix
% ls
foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o: No such file or directory
% ls
%

Paradox
Not only can you shoot yourself in the foot, your users can too.

Revelation
You’ll be able to shoot yourself in the foot just as soon as you figure out what all these bullets are for.

Visual Basic
You’ll shoot yourself in the foot, but you’ll have so much fun doing it that you won’t care.

Prolog
You tell your program you want to be shot in the foot. The program figures out how to do it, but the syntax doesn’t allow it to explain.

Ada
After correctly packaging your foot, you attempt to concurrently load the gun, pull the trigger, scream and shoot yourself in the foot. When you try, however, you discover that your foot is of the wrong type.

Assembly
You try to shoot yourself in the foot only to discover you must first reinvent the gun, the bullet, and your foot. After that’s done, you pull the trigger, the gun beeps several times, then crashes.

370 JCL
You send your foot down to MIS with a 4000-page document explaining how you want it to be shot. Three years later, your foot comes back deep-fried.

Python
You try to shoot yourself in the foot but you just keep hitting the whitespace between your toes. (via Marco Azaro)

alexteam
22.01.2010, 12:17
:D
есть русская версия данного текта. но, опять же. компилятор - дурак. его можно обмануть. да и сабжа опять же нет -)

klemberg
31.01.2010, 18:03
есть русская версия данного текта.http://yrs-raider.livejournal.com/6139.html

xkor
31.01.2010, 20:21
klemberg, эх, а про дельфи и там нет(

peacefully
02.02.2010, 20:33
Модула-2: После того, как вы понимаете, что фактически ничего не можете сделать на этом языке, вы простреливаете себе голову.
:D:D:D

peacefully
12.02.2010, 06:09
Вообщем, суть была, к чему вопрос. Надо построить сеть с фрактальной топологией (граф, короче). Нашел три способа:
1) Строить матрицу смежности. Самое простое. На каждом шаге роста сети вполне примитивно матрица изменялась, сделать не составило труда. Еще в начале темы было сказано, что это N*N бит. А когда построил оказалось, что процентов 80% (ну не важно по числу, ОЧЕНЬ много, короче) матрицы занимают нули. Потому вторая идея была (в теме озвучил тоже), чтобы избавиться от нулевых ячеек. С простейшими начальными параметрами прога сдохла на 3126 вершинах (следующий шаг не осилила).
2) Список смежности. Организовал как массив массивов. Без нулей работает шустрее гораздо, оно и понятно. С теми же параметрами генерация превысила 15к вершин, дальше прога корректно отказалась че-то делать по причине 'Out of memory'. До реальных размеров все равно не дотягивает...
3) Затрудняюсь сказать, какое у этого название и есть ли вообще. Что-то среднее между деревьями и списками. Мультисвязанный двунаправленный список какой-то, короче. Есть объект-вершина, у которой указаны следующие смежные вершины-потомки и предыдущая вершина-предок. Че-то схожее с сетью гиперссылок в WWW: заходишь на какую-нить страницу и знаешь: а) откуда пришел; б) куда можно уйти с нее, глядя на ссылки на ней. Кажись, чОтче отражает реальность, но вот памяти жрать будет больше, чем список смежности из п.2 (хоть и всего на ~N).

Забыл уже, к чему писал это.. короче, вопрос об том, как обойти 'Out of memory'. Что читать на тему "как разместить данные на жестком диске, чтобы быстро к ним обращаться (читать, редактировать)"? "Жесткий диск" и "быстро" - это, понимаю, не очень, но как-то надо. Пока в голову приходит только N файлов (=кол-ву вершин) с перечисленными смежностями, но уверен, что есть че-то рациональнее))

alexteam
12.02.2010, 13:25
если я правильно понял 3й пункт это некоторое подобие treeview.
памяти жрать будет немеряно..
писалось на коленке..

Tnode=class
ParentNode : Tnode; //откуда пришли.
CHildNodes : tlist; //куда можем пойти
Prop1:string; //одно из свойств этой вершины.
constructor create(SetParent:Tnode);
destructor destroy; override;
end;

constructor tnode.create;
begin
childnodes := tlist.create;
if ParentNode <> nil then
ParentNode.CHildNodes.add(self); //если есть парент - добавляем себя в список его чайлдов
end;

destructor tnode.destroy;
begin
if ParentNode <> nil then
ParentNode.CHildNodes.remove(self); //убираем себя из списка чайлдов парента

while CHildNodes.count > 0 do
Tnode(childnodes.items[0]).destroy; //уничтожаем все дочерние узлы
childnodes.destroy;
end;

использование (конечно же следует делать рекурсией)
var
TopLevel, CurrentParent: tnode;
i : integer;
begin
TopLevel := tnode.create(nil);
toplevel.prop1 := 'Верхний узел';
CurrentParent := tnode.create(toplevel);
CurrentParent.prop1 := 'Узел вложенный в верхний узел'
CurrentParent := tnode.create(toplevel);
CurrentParent.prop1 := 'Второй узел вложенный в верхний узел'
CurrentParent := tnode.create(toplevel);
CurrentParent.prop1 := 'Третий узел вложенный в верхний узел'
CurrentParent := tnode.create(CurrentParent);
CurrentParent.prop1 := 'Узел вложенный в третий узел вложенный в верхний узел';

while i < toplevel.childnodes do
begin
showmessage(Tnode(toplevel.childnodes.items).Prop1 ); //показываем свойство всех дочерних узлов верхнего узла
inc(i);
end;
TopLevel.destroy; //разрушение топлевела и всех его дочерних уровней с их дочерними уровнями
end;

сохранение и загрузку можно делать в tnode.create/tnode.destroy передавая туда скажем файлстим как параметр.
т.е. при создании нода он будет читать с файлстрима а при разрушении писать туда свои свойства и только тогда приступать к разрушению дочерних нодов.
кол-во дочерних узлов в каждом узле не должно превышать maxint (довольно большое значение)

[I]Добавлено через 38 минут
проверил.
у меня макс кол-во вершин в графе составило 52022554. дальше - закончилась память выделяемая приложению ~2гб. сурсы проверялки прикрепил. -)

Добавлено через 13 минут
можно использовать LargeAddressAware (или 4гбпатч) чтобы на 64битных машинах вместо 2гб памяти выделялось 4. что увеличит в 2 раза кол-во овзможных нодов.

peacefully
13.02.2010, 02:01
Мм.. познавательно, надо переварить.. такая топология точнее отражает реальность, а для исследования это важно. Аналогия с тривью действительно прямая, точн, спасибо))

Там вся трабла с тем, что число вершин по времени растет по N^(yt) закону, очень резко. Потому и теоретически, и практически (мои наработки по первым двум пунктам) показывают, что не всегда больше 15к вершин можно достигнуть, прежде чем память забьется. Максимально пока что получилось 67.5 тыщ нащупать. Потому хоть и тяжелее вершины, но зато красивее, чем матрицы и списки.


проверил.
у меня макс кол-во вершин в графе составило 52022554. дальше - закончилась память выделяемая приложению ~2гб. сурсы проверялки прикрепил. -)

Да, кушает неплохо байт на вершину..)

alexteam
13.02.2010, 12:04
угу.. аж целых 41 байт...
реализовать можно не классами а рекордами. по типу
Tnode = record
TopNode:pointer;
SubNodes:array of Tnode;
param:string;
end;

весить в памяти будет чуток меньше, код по обработке/добавлению/удалению будет "чуточку" сложней.

finomen
13.02.2010, 12:09
а можно попобробней про структуру сети?

peacefully
22.02.2010, 05:44
а можно попобробней про структуру сети?

Значит-с, представь граф. В начальный момент времени есть элементарный график (маленький граф т.е.)))) из N вершин, которые соединены звездой - к одной присоединены (N-1) других. Матрица выглядит как-то так:
0 1 1 1 1
1 0 0 0 0
1 0 0 0 0
1 0 0 0 0
(5 узлов, 1-ый соединен со всеми, 2-5-ые - только с первым).

k - степень вершины (т.е. число вершин, с которыми соединена данная; например, у 1-ой k=4, а у 3-ей k=1). На каждом шаге к каждому узлу (вершине) прибавляется k*m число узлов (m - какое-то постоянное целое число). Таким образом, получается однородный фрактал..

Далее второй метод, при котором принцип такой же, но в конце каждого шага связи с предыдущего шага с вероятностью e (e=0..1) будут пропадать и появляются между потомками того узла и потомками другого. Однородность нарушится.

Но меня интересует первый, с однородной структурой. Как его хранить, чтобы потом просчитывать. В матрице это не вариант ваще :)

xkor
22.02.2010, 17:41
peacefully, на нейронную сеть похоже)
хранить.., ну alexteam, хороший вариант предложил, но если памяти всё равно не хватает, то надо кэшировать данные на диск и извлекать по маленьку куски с которыми работаешь, правда при данных условиях не представляю себе структуру которую при каждом шаге не придётся полностью пересоздавать так как каждый элемент будет расширяться, а в виду того что элементов тож заоблачно, то и хранить каждый элемент в отдельном файле не выход.

думаю тут надо писать программу не на 32битной а 64битной адресации, тогда операционка сможет выдать мнооого гигов программе сама складывая не помещающееся на диск (ток виртуальную память надо будет сделать огромной, ну и ОС и компилятор должны быть 64разрядными, тоесть дельфи не катит)

peacefully
27.02.2010, 01:48
Подскажите, плиз, 64-битные среды, я нуп в этом, но разбираться умею) Си-шарпы последние держат? Или мб редакции какие-то отдельные... Че-то не могу найти.

xkor
27.02.2010, 05:01
peacefully, С# в принципе 64бита использовать умеет, у него на 64битной системе ограничение будет только на количество элементов в массиве (2 миллиарда с небольшим)
ЗЫ на C# и древовидную структуру которая тебе нужна будет проще намутить, единственное хз насколько оптимально оно будет память жрать, но думаю для твоей задачи приемлемо

peacefully
28.02.2010, 00:38
Да, скока классических структур не реализовывал, легче всего в сях получаецо.. Но к Делфям душа лежит больше) Что ж, попробуем-с..

Xa4ik
28.02.2010, 01:41
Сишарп ето аналог джавы, еще тормознутее, ехе содержит не выполняемый код а промежуточный, который компилит в процесе выполнения дотнет.
Я бы юзал Си билдер, он дает самый быстродействующий результат, впридачу Си компиляторы оптимизируют код.
Я бы запихивал в 1 чар 8 бит и побитно разбирал их if a=00000001b, записывать 1 бит в чар путем сложения с бинарным 10000b где количество нолей номер бита. Ето будет очень економично и быстродейственно, в отличии от делфовских 1 и 0 стрингов ))))

xkor
28.02.2010, 04:19
Сишарп ето аналог джавы, еще тормознутеену аналог впринципе да, а вот насчет тормознутости ты загнул, нифига не медленнее, а в вопросе GUI дык даст фору яве в пол версты
Я бы юзал Си билдерну ты и велосипед видимо одноколесный юзаешь
он дает самый быстродействующий результатага, если писать код асм вставками то да результат будет наибыстрейшим, впрочем как и на любом другом языке если писать асм вставками
впридачу Си компиляторы оптимизируют кодоткрою тебе секрет, все компиляторы оптимизируют код, причем виртуальная машана явы и .NET фреймворк оптимизируют намного лучше чем компиляторы нативных языков в иду того что они могут оптимизировать под конкретную платформу на которой работают
лучший оптимизатор на сколько я слышал у gcc, только вот это чисто компилятор, без удобного IDE типа визуал студии или дельфийской рад студии
Я бы запихивал в 1 чар 8 бит и побитно разбирал их if a=00000001b, записывать 1 бит в чар путем сложения с бинарным 10000b где количество нолей номер битавроде бы мы тут уже отказались от битовых матриц в пользу деревьев, так что к чему ты это написал хз
Ето будет очень економично и быстродейственно, в отличии от делфовских 1 и 0 стрингов ))))причем тут дельфийские стринги дающие фору сишным пчарам я тоже не понял, все битовые операции дельфи поддерживает как и си

ЗЫ Xa4ik, кончай выпендриваться и делать вид что ты всё знаешь...

Xa4ik
28.02.2010, 05:00
о gcc так говрят потому что он кеду компилит сутки.
делфи компилит проект с 1 конопчкой мгновенно, си билдер думает 3 секунды. Первые версии делф точно оставляли код как есть, далее с 7 версии торомза при компиляции появляются от куч подключеный модулей по умолчанию.
Для работы с гуи и кнопочками пойдет любой язык, и пофиг что при нажатии кнопочки на яве произходит 1,5 тыс асемблерных операцый, современный проц все скушает. Если уже реч пошла о обработке гигобайта побитно, то есть большая разница для обработки 1 бита будет выполнено 10 или 25 операцый. Код етого мегацыкла нужно писать вручную, и в нем нельзя использывать обращений через точку и прочих впустую коприующих.
я знаю как боротся за каждую комнаду на цсп, а тут всем на скорость пофигу.

alexteam
28.02.2010, 13:21
слыш, земляк, а ну хватит срать в топегах, пытаясь при этом еще и доказать шо ты знаешь больше окружающих, при этом фейлишся пиздец как, доказывая попутно обратное.

возмем к примеру:
Ето будет очень економично и быстродейственно, в отличии от делфовских 1 и 0 стрингов
пиздец умник, ты кроме типа стринг других не знаешь ? булевый там к примеру.. не ?

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

в нем нельзя использывать обращений через точку
если ты это в сторону обращения к полю класса, то во первых, научись называть все своими именами а во вторых то ты опять зафейлился ибо ничем не отличается от обращения к обычной переменной, выполняеться ровно за то же кол-во тактов.
на, оцени:
http://i.piccy.info/i4/b8/0c/560316711601fa09cd750f76d4e7.png
и прекрати фейлится.

Developer
02.04.2010, 16:45
1кк столбцов уже абсурдно, либо имелось ввиду что то другое.
Если количество символов в строке неизменно, то можно хранить построчно в обычном файле. В таком случае через Stream всегда можно будет организовать быстрый доступ к данным.
А насчет ввода/вывода, можно подойти своеобразно, без использования грида. Например использовать Caption создаваемый по образцу динамически на каждую строку. По нажатию на символ, вычислять его позицию относительно начала строки (почему бы не использовать моноширный шрифт?)