Я написал некоторый код Ruby для импорта данных Google n-gram в хеш-таблицу, сопоставляя униграмм слота с их соответствующими значениями. Я использую символы, а не строки для ключей. Я уже давно запускаю этот код в linux box без проблем. Запуск на моем Mac сегодня утром дал ошибку переполнения таблицы символов после загрузки около 2 миллионов пар ключ-значение. Я не понимаю, что вызывает эту ошибку. У кого-нибудь есть предложения о том, что может быть причиной? Я запускаю Ruby 1.9.1 под OS X 10.5.8.Проблема с переполнением таблиц символов в Ruby
ответ
Разница 64-бит. 32-битный рубин? Я подозреваю, что это из-за вашего наблюдения
дали ошибку переполнения во время выполнения таблицы символов после загрузки около 2 миллионов пар ключ-значение
Если это так, то вы не можете делать ничего об этом, но с использованием встроенная 64-битная сборка ruby, если строки не являются вариантом из-за дизайна приложения. В противном случае вам придется идти со строками. Преобразование легко:
:symbol.to_s == "symbol"
"symbol".to_sym == :symbol
При использовании Symbol для ключей вместо строки, как правило, более эффективны, количество эффективности получило пропорционально уровень дублирования вовлеченного. Поскольку ваши ключи по определению уникальны, вам, вероятно, следует просто использовать клавиши String, чтобы избежать заклинивания таблицы символов, заполненной элементами.
Я предполагаю, что есть некоторые сбережения при поиске, но насколько это важно, неясно. Так что строк вполне может быть достаточно. – Chris
При поиске будет только экономия, если ключ, который вы пытаетесь решить, был предварительно закодирован, и даже тогда легко утверждать, что менее эффективно хэш-строку в символ, а затем хэш-символ, а не просто хэш строка. В конце концов, все пространство символов функционирует как хэш. – tadman
или используйте строки! – Peter
Думайте, что вы натолкнулись на проблему! Благодаря! – Chris