Где хранить данные c: Где хранить данные, когда их слишком много
Содержание
python — Где лучше хранить данные и с помощью чего?
Вопрос задан
Изменён
6 лет 3 месяца назад
Просмотрен
2k раз
Ситуация такая. Есть примерно одна сотня записей такого вида:
{'name': 'Yuri', 'start': 55, 'enemies': ('Nick', 'Lora', 'Frank', 'Bernard', 'Phoebee', 'Jack', 'Cristina', 'Stephen', 'Joe', 'Gary', 'Robert')}
Это одна запись. Ранее для их хранения использовался модуль shelve
. Сейчас же нужно что-то кроссплатформенное, и я не знаю, что мне выбрать. Данные в будущем не будут изменяться программой или как-то дополняться, они останутся точно такими же.
Всё, что будет происходить «внутри», это получение информации из этих словарей: например, по имени Yuri
нужно будет найти start
и его enemies
и, если среди них есть Lora
, то найти и её enemies
, ну и в этом роде. Был вариант использовать csv
, но я не уверен, хороший ли это выбор в данном случае. Какие есть предложения? Обоснуйте свой ответ, пожалуйста.
- python
- база-данных
- python-3.x
3
Для такого объема данных и с учетом того, что они не изменяются и должны быть доступны кросплатформенно, вам стоит посмотреть в сторону JSON.
В нем легко хранить объекты типа словарей и инструменты для работы с JSON есть в стандартной библиотеки почти каждого ЯП.
2
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.
Как и где хранить информацию из телефона?
У владельцев смартфонов рано или поздно возникает необходимость дополнительного хранилища для имеющихся на устройстве данных: информации из приложений, фотографий, видео, контактов и многого другого. Необходимость резервного копирования данных обуславливается множеством факторов, в числе которых желание сохранить данные в безопасности если:
• смартфон на Андроиде требует ремонта или необходима перепрошивка аппарата;
• при покупке новой модели необходимо перенести данные со старого устройства;
• существует риск потери девайса и поэтому необходима резервная копия для последующей возможности ее восстановления на любом другом устройстве;
• закончилась память в гаджете;
• необходимо осуществить распечатку каких-либо данных (фото, текстовых документов и т.д.).
Выбирая место для хранения информации важно также учитывать надежность хранилища, сроки хранения данных и условия, в которых будет осуществляться хранение.
GOOGLE ДИСК, ПРЕИМУЩЕСТВА И ОСОБЕННОСТИ ИСПОЛЬЗОВАНИЯ
Решая вопрос, как и где хранить информацию с телефона, если телефон андроид, к примеру надёжная марка Highscreen, необходимо помнить о том, что самым популярным на сегодняшний день для данной операционки является облачный сервис компании Google. Благодаря большому объему для хранения личной информации, наличию офисного пакета, быстрой синхронизации, кроссплатформенности и многому другому, облако Гугл на сегодняшний день является наиболее удачным из предложенных вниманию пользователей. Сервис называется Google Диск и предлагает к использованию 5 Гб на бесплатной основе и 10 Гб – на платной.
К числу достоинств использования Гугл Диска относится возможность: создания файлов различных форматов, доступа к данным с разных устройств, распознавания скан-страниц и фото с текстом, преобразования письменного текста в речевую запись. Главное условие – наличие учетной записи Гугл, если таковой не имеется необходимо сначала зарегистрироваться в системе и создать свой аккаунт. Удобство использования Google Диск также и в том, что пользоваться сервисом можно как с ПК, так и со смартфона, специально для этих целей был создан мобильный клиент Google Disk. Благодаря простой и адаптированной навигации приложение очень удобно и мало чем отличается от компьютерной версии, пакет включает утилиты для открытия медиа-файлов и текстовых документов. Приложение доступно на официальном сайте Гугл и в Плей Маркет.
Коротко использование Google Disk выглядит следующим образом:
• Создаем учетную запись Гугл;
• Скачиваем и устанавливаем мобильный клиент Гугл Диск из Плей Маркет или с официального сайта;
• В личном кабинете открываем приложение Google Disk;
• Выбираем вкладку «Создать», далее – «Загрузить файл», после этого откроется окно, где необходимо выбрать желаемый объект. Для удобства использования сервиса можно самостоятельно создавать папки;
• Загружать и просматривать файлы можно в любое время, также, вы можете открывать доступ к данным для друзей и коллег, удалять утратившие актуальность файлы.
Необходимо отметить, что неоценимым преимуществом создания аккаунта Гугл является не только доступ к облачному хранилищу системы. Дабы обезопасить своих пользователей от утраты ценных данных в результате похищения мобильного устройства злоумышленниками специалистами компании была разработана система удаленного доступа, при помощи которой можно управлять девайсом и удалять данные с него дистанционно. Для этого необходимо с любого другого устройства зайти на сайт https://www.google.com/android/devicemanager под своим аккаунтом. Обязательным условием для соединения со смартфоном является включенный Вай-Фай или мобильный интернет, и активированная функция «Удаленное управление Android» (включается автоматически после входа в свою учетку, но некоторые пользователи ее выключают). Если все выполнено верно – устройство обнаружено, можно удалять данные. Дистанционный сброс возвращает устройство к заводским настройкам, очищая его память от личных данных пользователя, однако после удаления информации будет прерван и доступ к удаленному управлению.
ЗАЩИТИ СВОЙ СМАРТФОН – УСТАНОВИ ПАРОЛЬ
Касаясь темы: как и где хранить информацию с телефона, важно подумать не только о надежности выбираемого хранилища, но и том, как защитить смартфон на Андроиде от вмешательства посторонних, детей или в случае утери мобильного телефона.
Самый лучший вариант – установить на устройство пароль. Много времени и усилий это не займет, зато важность такой защиты переоценить трудно. Все современные операционные системы предлагают большой выбор блокировок и дают возможность потребителям самостоятельно выбрать подходящий. Самый распространённый способ защиты сотовых на ОС Андроид — пин код блокировки экрана.
Также, по мнению специалистов по безопасности, такой модный и интересный графический ключ, а также, другие новые интересные способы блокировки смартфона существенно уступают по надежности таким традиционным вариантам, как PIN-код или цифро буквенный пароль. Защита информации, которая храниться на мобильном устройстве, это достаточно важный комплекс мероприятий, но если по каким-либо причинам пользователь пренебрегает им, тогда лучше не хранить на смартфоне информацию личного характера во избежание несанкционированного доступа к ней.
ДРУГИЕ ВАРИАНТЫ ХРАНЕНИЯ ДАННЫХ С ТЕЛЕФОНА
Разумеется, Google Диск не единственное решение вопроса, как и где хранить информацию с телефона. С хранением личных данных прекрасно справляются и традиционные хранилища в виде жестких дисков, Flash-накопителей, а также, облачные и почтовые сервисы различных компаний.
Если говорить о жестких дисках, срок эксплуатации их составляет в зависимости от внешних факторов и качества устройства от трех до десяти лет. Что касается флеш-накопителей, в среднем срок эксплуатации их составляет порядка пяти лет, если продолжать пользоваться накопителем по окончанию этого времени, существует риск того, что он выйдет из строя раньше из-за любого незначительного статического разряда при подсоединении к ПК и доступ к данным станет уже невозможным. Если же использовать флешку исключительно как хранилище, срок ее службы будет приличным и составит до восьми лет.
О продолжительном хранении информации на облачных хранилищах (Dropbox, Box, Copy. com, Яндекс.Диск, OneDrive, Облако.mail.ru, Mega, Hive, Bitcasa, Minbox и т.д.) и почтовых сервисах (mail.ru, mail.com, Яндекс. Почта, gmail.com, Yahoo.Почта, Live.com, Mailinator и т.д.) говорить сложно, т.к. все зависит от компании, которая предоставляет услугу хранения, кроме того, по лицензии многих из них ответственность за потерю данных корпорации не несут, также, помним об опасности взлома аккаунта злоумышленниками. Подытожив, делаем вывод, что самыми недорогими и доступными являются жесткие диски и облачные хранилища, таким образом оптимальным решением повышения сохранности данных станет их использование в тандеме.
Интернет-магазин сотовых телефонов марки Хайскрин
Каталог смартфонов Highscreen
Вернуться обратно
Перейти в каталог
int — Как данные хранятся во время программирования на C?
Когда я думаю о хранении переменных в C, в основном я думаю о машинно-независимых блоках. Итак,
int x = 123;
первая мысль, что это выглядит так:
+-----------+ х: | 123 | +-----------+
А поскольку это локальная переменная, я знаю, что эта коробочка находится в стеке. (Подробнее об этом ниже.)
Итак, вы спросили об отдельных байтах и представили себе двухбайтовую int
начиная с адреса 2000
. Итак, вот как это будет выглядеть, более подробно. Чтобы подчеркнуть содержимое отдельных байтов, я собираюсь переключиться на шестнадцатеричный формат:
+------+ х: 2000: | 0x7b | +------+ 2001: | 0x00 | +------+
Вы, наверное, поняли это, но это число 0x7b
является частью шестнадцатеричного представления 123
. Десятичное число 123
имеет шестнадцатеричное представление 0x007b
. Это предполагает двухбайтовое целое число, хотя стоит отметить, что в наши дни большинство машин, которые вы, вероятно, будете использовать, будут использовать четыре байта. Я также показал ситуацию для хранения с прямым порядком байтов, которое сегодня используется большинством машин. Байт с меньшим номером является наименее значащим байтом.
Поскольку 123
на самом деле просто 7-битное число, оно занимает только один из двух байтов, а другой равен нулю. Чтобы быть действительно уверенными, что мы понимаем, как расположены два байта, предположим, что мы присваиваем x новое значение:
х = 12345;
Шестнадцатеричное представление 12345
равно 0x3039
, поэтому изображение в памяти меняется на это:
+------+ х: 2000: | 0x39 | +------+ 2001: | 0x30 | +------+
Наконец, для сравнения предположим, что я сказал
long int y = 305419896;
Предположим, что это было на машине с обратным порядком следования байтов. Предположим, что long int
составляют четыре байта, и предположим, что компилятор решил поместить y
на адресе 3000. Это случайное число 305419896
имеет шестнадцатеричное представление 0x12345678
, поэтому ситуация в памяти (опять же, предполагая байт-порядок больших эндов). —+
г: 3000: | 0x12 |
+——+
3001: | 0x34 |
+——+
3002: | 0x56 |
+——+
3003: | 0x78 |
+——+
При хранении с прямым порядком байтов младший адрес содержит самый старший байт, что означает, что число читается слева направо (здесь сверху вниз) в памяти. Но, как я уже сказал, большинство машин, которые вы, вероятно, будете использовать сегодня, имеют обратный порядок байтов.
Как я уже упоминал, поскольку x
в вашем примере является локальной переменной, она обычно хранится в стеке вызовов функций. (Как заметил комментатор, нет никакой гарантии, что в языке С есть стек, но у большинства он есть, так что давайте исходить из этого предположения.) Чтобы увидеть разницу между локальными и глобальными переменными, а также показать, как парочка других типов данных хранится, давайте посмотрим на немного больший пример и давайте расширим наши возможности, чтобы представить себе всю память. Предположим, я пишу
целое г = 456; char s[] = "привет"; интервал основной () { инт х = 123; char s2[] = "мир"; символ *р = с; }
Обычно глобальные переменные хранятся в нижней части памяти, а стек хранится «вверху» и растет вниз. Таким образом, мы можем представить, как выглядит память нашего компьютера. Как вы увидите, я изменил соглашение, которое использовал на предыдущей картинке. На этом рисунке адреса памяти идут от до страницы. (Кроме того, адреса памяти теперь тоже в шестнадцатеричном формате, и я опускаю 0x
обозначение. Также я возвращаюсь к прямому порядку байтов, но сохраняю понятие 16-битной машины. Также я собираюсь показать значения символов сами по себе, а не в шестнадцатеричном формате. Также я показываю неизвестные байты как ??
.)
+------+ ффек: | ?? | +------+ ффеб: | 00 | +------+ х: ffea: | 7б | +------+ ffe9: | 00 | +------+ ffe8: | 'д' | +------+ ffe7: | 'л' | +------+ ffe6: | 'р' | +------+ ffe5: | 'о' | +------+ s2: ffe4: | 'ш' | +------+ ffe3: | 02 | +------+ р: ffe2: | 80 | +------+ ffe1: | ?? | +------+ . . . +------+ 0282: | ?? | +------+ 0281: | 00 | +------+ 0280: | 'о' | +------+ 0283: | 'л' | +------+ 0282: | 'л' | +------+ 0281: | 'е' | +------+ с: 0280: | 'ч' | +------+ 0283: | 01 | +------+ г: 0282: | с8 | +------+ 0281: | ?? | +------+
Конечно, это сильное упрощение, но оно должно дать вам основную идею, и я по-прежнему считаю полезным думать об этом таким образом, несмотря на все эзотерические возможные сложности, которые обсуждают комментаторы. Следующим шагом может быть демонстрация того, как выглядит память malloc
‘ed, и как обстоят дела, когда у нас есть несколько активных вызовов функций в стеке, но этот ответ становится слишком длинным, поэтому мы отложим его на другой день. .
Как я могу хранить данные в C в табличном формате?
Я хочу хранить данные в C в табличном формате. Мне трудно рассказать следующее. Кто-нибудь может помочь?
Например:
Я хочу сохранить следующие записи, тогда каким должен быть идеальный способ хранения в C?
IP-адрес Имя домена 1.) 10.1.1.2 www.yahoo.com 2.) 20.1.1.3 www.google.com
Должен ли я использовать структуры? Скажем, например?
структурная таблица { беззнаковый символьный IP-адрес; char имя_домена[20]; };
Если нет, уточните?
- c
- структуры данных
Вероятно, вы смешиваете два разных вопроса:
- Как организовать данные в вашей программе (в памяти) — это часть об использовании структур.
- Как сериализовать данные, то есть сохранить их во внешнем хранилище, например. в файле. Это часть о «табличном» формате, который подразумевает текст с полями, разделенными табуляцией.
Если IP и домен часто встречаются в вашей программе, то разумно использовать для этого структуру или класс (в C++). Что касается вашего примера, я не знаю ограничений на длину доменного имени, но «20» было бы определенно недостаточно. Я бы предложил здесь использовать динамически выделяемые строки. Для хранения IP-адреса (v4) вы можете использовать 32-битное целое число без знака — char недостаточно. Планируете ли вы также поддерживать IP v6? тогда вам нужно 128 бит для адреса.
В C (и C++) нет встроенного средства сериализации, как практически во всех динамических (или «управляемых») языках, таких как C#, Java, Python. Таким образом, определяя структуру, вы не получаете автоматически методы для записи/редактирования ваших данных. Поэтому вы должны использовать некоторую библиотеку для сериализации или написать свою собственную для чтения/записи ваших данных.
Способ хранения хотя бы частично зависит от того, что вы собираетесь делать с информацией. Если это просто прочитать его, а затем снова распечатать, вы можете обрабатывать его строго как текст.
Однако сетевые программы часто используют этот тип данных. См. структуры в системных заголовочных файлах netinet/in.h
, arpa/inet. h
и sys/socket.h
Или см. справочную страницу для inet_aton()
идти. Используйте массивы достаточного размера. Адреса IPV4 занимают 16 символов, а доменные имена — не более 255 символов.
структурная таблица { char ip_addr[16]; char имя_домена[255]; };
3
К сожалению, я не могу комментировать. Но что касается ответа Амаргоша, эта проблема была бы идеально решена с использованием массивов фиксированной длины для полей, поскольку оба набора (если домен только верхнего уровня) данных имеют ограниченную длину (15 символов для IP-адреса [при условии IPv4], и существует ограничение в 63 символа ascii на метку для доменных имен.)
2
При представлении табличных данных возникают две проблемы:
1. Представление строки
2. Представление множества строк.
В вашем примере строка может быть представлена следующим образом:
struct Table_Record { беззнаковый символ ip_address[4]; char имя_домена[MAX_DOMAIN_LENGTH]; };
Я решил использовать фиксированную длину поля для имени домена. Это упростит обработку.
Следующий вопрос — как структурировать строки. Это решение вам придется принять. Самое простое предложение — использовать массив. Однако массив имеет фиксированный размер, и его необходимо перераспределить, если записей больше, чем размер массива:
struct Table_Record table[MAX_ROWS];
Другой структурой данных для таблицы является список (одинарный или двойной, на ваш выбор). К сожалению, язык C не предоставляет структуру данных списка, поэтому вам придется либо написать свою собственную структуру, либо приобрести библиотеку.
Альтернативными полезными структурами данных являются карты (ассоциативные массивы) и деревья (хотя многие карты реализованы с использованием деревьев). Карта позволит вам получить значение для данного ключа. Если ключом является IP-адрес, карта вернет доменное имя.
Если вы собираетесь читать и записывать эти данные с помощью файлов, я предлагаю использовать базу данных, а не писать свою собственную.