Очень хороший пост, и вы правы! Назад к исходной точке тогда. для некоторых очень основных вещей Кроме этого, я не программист. Но как тяжело вы думаете, что это реализовать функцию кэширования? Я проверял Bitcoin-QT процесс, и это выглядит, как и большинство из его активности I / O происходит в blkindex.dat файл, который вполне может поместиться в памяти большинства людей. Как вы думаете, что это выполнимо кэширует весь файл в памяти? Конечно, умнее алгоритм кэширования будет гораздо лучше, но и совсем немного сложнее реализовать. И мы должны убедиться, что внезапная потеря мощности не приведет к повреждению blockchains.
Кстати, только для справки, я начал писать
оружейный около 9 месяцев назад, когда blockchain было несколько сотен мегабайт. Я задал тот же самый вопрос, и даже построил экспериментальный, скорость оптимизированного сканера blockchain, который содержит всю blockchain в памяти. Он был весьма успешным для тех, которые имеют достаточный объем оперативной памяти, но он собирается стать непригодными для использования
очень скоро. Blockchain имеет более чем вдвое, так как я начал, и это увеличение скорости. Я карабкаться, чтобы получить что-то там так, что системы с менее чем 4 Гб оперативной памяти можно использовать ...
Вместо этого я переключение на MMAP на основе решения, которое кажется, дает лучшее из обоих миров. Это лечение дискового пространства, как памяти, и доступ к памяти извлекает данные с диска, если он не находится в кэше. Хорошая вещь об этом, если у вас есть система с 8 Гб оперативной памятью +, он просто будет кэшировать всю blockchain и вы получите преимущество первоначальной реализации. Но если у вас есть меньше оперативной памяти, он кэширует столько, сколько он может, и якобы разумно. Кэширования зависят от операционной системы, но достаточно оптимизировано, так как это то, что на самом деле реализуется на уровне ядра. Единственное соображение есть в том, что если вы собираетесь каким-то структурированная модель доступа к файлу, то вы можете "консультировать" mmap'd память о нем, и она оптимизирует себя для него (то есть - если вы собираетесь открыть весь файл последовательно, он начнет кэширование сектора + 1, как только вы читаете сектор I).
Проблема с "почему бы не держать все в памяти?" вопросов является то, что с Bitcoin, нет никаких ограничений на то, что "все" будет. Я не знаю точно, что держит blockindex, но нет никакой гарантии, что он не получит дико из рук - может быть, кто-то выясняет, как спам blockchain с определенными типами наворотов. Тогда, тысячи пользователей, которые вы использовали программу в течение нескольких месяцев, вдруг не могут больше загрузить клиент. Даже с blockchain обрезки, нет никаких гарантий.
Итак, мои уроки из оружейной стали, что вы никогда не должны рассчитывать на что-то проводится полностью в оперативной памяти. И мне нравится решение gmaxwell по имеющему SPV-узел, пока синхронизация не завершается, то переключение. Я обдумывал это много в последнее время, но не придумал хороший, надежный (и пользователь понятно) способом реализации еще.