Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126

Как хранить большой числовой массив для быстрого доступа и сортировки

31.07.2019, 00:19. Показов 1306. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго времени суток! В своей программе создаю массив - это координаты пикселя x,y и цвет в RGB. Решил, что для этого как нельзя лучше подходит массив byte[,][] - byte[координатаX,координатаY][RGB]. С созданием и записью в текстовый файл - без проблем. Но использовать для дальнейшего поиска и сравнения с другим похожим массивом явно не получается. Дело в том, что картинка 4096х4096, и на каждый пиксель по три значения. Итоговый файл имеет 16777216 строк по 3 числа (от 1 до 3-хзначного) через пробел. Задумался об этом, когда начал "Parse" 50331648 строк.
Есть ли возможность как-то по другому хранить эти данные? Или может, можно быстрее вытянуть данные из файла?
Вот код:
Создание массива
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        //картинка подгружается на Open
        Bitmap pic;
        int x1, y1, a1, r1 ,g1 ,b1;
 
        private void button3_Click(object sender, EventArgs e)
        {
            StreamWriter fp = new StreamWriter("D:\\MyProg\\cvetoprof\\RGB_0.prfs");
            pic = new Bitmap(pictureBox1.Image);
            byte[,][] Arr = new byte[4096,4096][];
            r1 = g1 = b1 = 0;
            y1 = 0;
            x1 = 0;
 
            for (x1 = 0; x1 < 4096; x1++)
            {
                for (y1 = 0; y1 < 4096; y1++)
                {
                    Color color = pic.GetPixel(y1, x1);
 
                    Arr[x1, y1] = new byte[3];
                    Arr[x1, y1][0] = color.R;
                    Arr[x1, y1][1] = color.G;
                    Arr[x1, y1][2] = color.B;
                    fp.Write(Arr[x1, y1][0] + " " + Arr[x1, y1][1] + " " + Arr[x1, y1][2] + "\n");
                }
            }
            fp.Close();
        }
Вот так пытался достать данные из своего массива
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 private void button4_Click(object sender, EventArgs e)
        {
            byte[,][] Arr1 = new byte[4096, 4096][];
            byte n;
 
            //прочитать весь файл по пути и создать на его основе массив строк
            var str = File.ReadAllText("D:\\MyProg\\cvetoprof\\RGB_0.prfs").
                Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
 
            //закинуть в байтовый массив
            for (int m = 0; m < str.Length; m++)
            {
                n = Byte.Parse(str[m]);
                for (int i = 0; i < 4096; i++)
                {
                    for (int j = 0; j < 4096; j++)
                    {
                        Arr1[i, j] = new byte[3];
 
                        for (int q = 0; q < 3; q++)
                        {
                            Arr1[i, j][q] = n;
                        }
                    }
                }
            }
            //вывод контрольного значения.
            StreamWriter fpp = new StreamWriter("D:\\MyProg\\Test\\Test.prfs");
            fpp.WriteLine(Arr1[2, 1][0]);
            fpp.Close();
        }
Есть идея, хранить тестовые картинки и каждый раз при запуске программы их открывать, и на их основе заново создавать массив, но это кажется как-то наивно, уверен есть достаточно простое решение, как хранить массивы числовых данных, загружаемые вместе с программой. В программировании абсолютный новичок, многого не знаю, я дизайнер, просто делаю себе инструмент для работы, потому если не затруднит, прошу ответить попонятней для новичка.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2019, 00:19
Ответы с готовыми решениями:

Как переделать данный код быстрой сортировки под определенный числовой массив?
Есть программный код быстрой сортировки под другой числовой массив (7, 12, 25, 3, 17) n=5, c=5 (кол-во элементов в массиве) i=5 div...

Как хранить пароли для доступа к программе?
Есть программа, доступ к которой осуществляется через подтверждение личности(ввод пароля). Иного способа кроме как хранить пароль в...

Как хранить в приложении большой объем текста
как вставить текст в Visual Basic?

4
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
31.07.2019, 12:12
Зачем вам хранить ту же самую картинку, но в вашем, переработанном формате, если она и так уже храниться, как картинка? Храните это все картинкой и читайте значения каналов из нее напрямую
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
03.08.2019, 16:20  [ТС]
Зачем мне хранить картинку и каждый раз ее читать через медленный GetPixel? Хотя бы ради скорости приложения, ведь мне нужна не картинка, а числовой массив. В общем, решение я нашел. Пишу для таких, как я, новичков, может, кому пригодится.
Вот так теперь происходит заполнение массива один раз и запись его в файл, в дальнейшем будет использоваться только записанный файл, а не графическая картинка, что ускоряет работу примерно в 10 раз (точно не замерял, но если считывание с картинки происходит примерно 25 - 30 сек, то заполнение массива с записанного бинарного файла всего около 3 сек!).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        Bitmap pic;
        int x1, y1, a1, r1 ,g1 ,b1;
        byte[,][] Arr = new byte[4096, 4096][];
        private void button3_Click(object sender, EventArgs e)
        {
            pic = (Bitmap)Image.FromFile("D:\\MyProg\\cvetoprof\\RGB_0.tif");
            
            r1 = g1 = b1 = 0;
            y1 = 0;
            x1 = 0;
 
            FileStream FileRec = new FileStream("D:\\MyProg\\Test\\DlyaTestov.prfs", FileMode.Create, FileAccess.Write);
            BinaryWriter bw = new BinaryWriter(FileRec);
 
            for (x1 = 0; x1 < 4096; x1++)
            {
                for (y1 = 0; y1 < 4096; y1++)
                {
                    //Чтение пикселя
                    Color color = pic.GetPixel(y1, x1);
                    //Массив данных
                    Arr[x1, y1] = new byte[3];
                    Arr[x1, y1][0] = color.R;
                    Arr[x1, y1][1] = color.G;
                    Arr[x1, y1][2] = color.B;
                    //запись массива в файл для дальнейшего использования
                    for (int i = 0; i < 3; i++)
                    {
                        bw.Write(Arr[x1, y1][i]);
                    }
                }
            }
            bw.Close();
            FileRec.Close();
        }
И, собственно, считывание с записанного файла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 private void button4_Click(object sender, EventArgs e)
        {
            FileStream FileRead = new FileStream("D:\\MyProg\\Test\\DlyaTestov.prfs", FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(FileRead);
 
            for (int i = 0; i <= 4096-1; i++)
            {
                for (int j = 0; j <= 4096-1; j++)
                {
                    Arr[i, j] = new byte[3];
                    for (int q = 0; q < 3; q++)
                    {
                        //Чтение из файла
                        (Arr[i, j][q]) = br.ReadByte();
                    }
                }
            }
            FileRead.Close();
            br.Close();
        }
0
 Аватар для Toros1992
899 / 554 / 275
Регистрация: 26.11.2015
Сообщений: 1,758
Записей в блоге: 2
03.08.2019, 16:39
Прочитайте про метод Bitmap.LockBits и не изобретайте велосипед. он как раз для этого. Загружает в память массив байт без ненужных промежуточных файлов.
0
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
03.08.2019, 16:42  [ТС]
Тему, я думаю, можно пометить, как решенную.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.08.2019, 16:42
Помогаю со студенческими работами здесь

Как лучше хранить большой объем информации
Здравствуйте, собственно сабж. У меня есть информация, в виде двухмерного массива(String, но можно и Integer). Ограничения в размере...

Упорядочить одномерный числовой массив по возрастанию методом сортировки подсчетом
Упорядочить одномерный числовой массив по возрастанию методом сортировки подсчетом. Выходной массив заполняется значениями –1. Затем для...

В какой папке сохраняется панель быстрого доступа для Word 2007?
Допустим я хочу перенести панель быстрого доступа с одного компьютера на др. Как это сделать?

Как сделать чтоб при запуске Б/Д Access 2007 лента и панель быстрого доступа не появлялась
Подскажите пожалуйста как заделать чтоб при запуске Б/Д Access 2007 ЛЕНТА и ПАНЕЛЬ БЫСТРОГО ДОСТУПА не появлялось (как бы были не...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru