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