Это эффективный способ использовать структуру данных Nim ref?

#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. Спасибо, хорошее наблюдение, я не понял, что я сохраняю каждую компанию дважды и могу использовать упорядоченную таблицу :). Что касается глобальных данных — я использую отложенную загрузку, загрузка этих компаний с диска занимает некоторое время, и я хотел бы избежать быстрой загрузки и загружать ее только в том случае, если она действительно используется.