#nim-lang
#nim-lang
Вопрос:
Я храню в памяти огромный список компаний, и мне нужно выполнить множество операций для получения отдельной компании.
Например, получение отдельной компании «Microsoft» по ее символу «MSFT».
Будет ли приведенная ниже структура данных подходящим способом для моделирования этого? Не должно быть копирования по значению целого list
или map
.
Это нормально, если отдельная компания будет скопирована по значению.
import tables
type
Company = object
name: string
symbol: string
description: string
CompaniesRef = ref object
list: seq[Company]
map: Table[string, Company]
# Cached data structure to keep thousands of different companies
var cached_companies: CompaniesRef
proc companies(): CompaniesRef =
if cached_companies == nil:
# Here will be a proper code of loading companies into the
# CompaniesRef data structure
cached_companies = CompaniesRef()
cached_companies
# Lots of operations of getting a specific company from the list
# or from the map by its symbol
for i in 1..1000:
# it's ok if individual company will be copied by value,
# but the whole list should be passed by reference
let company1 = companies().list[0].name
# it's ok if individual company will be copied by value
# but the whole map should be passed by reference
let company2 = companies().map["MSFT"]
Ответ №1:
Эта глобальная структура должна быть в порядке, как есть, ссылка на объект — это просто указатель, управляемый памятью, поэтому передача его ссылки только копирует адрес памяти. Если вы не собираетесь что-то делать с этим указателем, почему бы не создать его как глобальный? Скрывать это за вызовом proc попахивает шаблоном Я-боюсь-глобалов, но-не-могу-жить-без-них-одноэлементный.
let companies = CompaniesRef()
Что касается содержимого структуры, вы сохраняете дважды каждый Company
объект, вы можете захотеть сохранить ссылку на Company
в Table
или просто использовать OrderedTable, если вам нужно сохранить порядок вставленных ключей.
Комментарии:
1. Спасибо, хорошее наблюдение, я не понял, что я сохраняю каждую компанию дважды и могу использовать упорядоченную таблицу :). Что касается глобальных данных — я использую отложенную загрузку, загрузка этих компаний с диска занимает некоторое время, и я хотел бы избежать быстрой загрузки и загружать ее только в том случае, если она действительно используется.