В настоящее время мы используем ZedGraph для построения линейной диаграммы некоторых данных. Входные данные поступают из файла произвольного размера, поэтому мы не знаем, какое максимальное количество данных должно быть заранее. Однако, открыв файл и прочитав заголовок, мы можем узнать, сколько точек данных находится в файле.
Формат файла по существу [time (double), value (double)]. Однако записи не являются равномерными по временной оси. Между точками t = 0 сек и t = 10 сек не должно быть точек, но может быть 100 К между t = 10 с и t = 11 сек и т.д.
В качестве примера наш тестовый файл набора данных составляет ~ 2.6 ГБ, и он имеет 324 М точек. Мы хотели бы показать весь график пользователю и позволить ей перемещаться по диаграмме. Однако загрузка 324M точек в ZedGraph не только невозможна (мы на 32-битной машине), но и не полезна, так как нет смысла иметь так много точек на экране.
Использование функции FilteredPointList для ZedGraph также представляется непостижимым, поскольку для этого требуется сначала загрузить все данные, а затем выполнить фильтрацию этих данных.
Итак, если мы ничего не пропустили, похоже, что наше единственное решение - как-то - уничтожить данные, однако по мере того, как мы продолжаем работать над этим, мы сталкиваемся с множеством проблем:
1- Как мы уничтожаем данные, которые не поступают равномерно по времени?
2- Поскольку все данные не могут быть загружены в память, любой алгоритм должен работать на диске, поэтому его необходимо тщательно спроектировать.
3 Как мы обрабатываем увеличение и уменьшение масштаба, особенно, когда данные не однородны по оси x.
Если данные были единообразными, то при начальной загрузке графика мы могли бы Seek()
определить предопределенное количество записей в файле и выбрать каждый N других образцов и передать его в ZedGraph. Однако, поскольку данные неравномерны, мы должны быть более интеллектуальными в выборе образцов для отображения, и мы не можем придумать какой-либо интеллектуальный алгоритм, который не должен был бы читать весь файл.
Извиняюсь, так как вопрос не имеет четкой специфичности, но я надеюсь, что смогу объяснить природу и масштаб нашей проблемы.
Мы находимся в Windows 32-bit,.NET 4.0.