ОК, мы получили настоящий угловой пример:
- 500x100 000 = 50 000 000 элементов.В зависимости от типа данных это приводит к ок.50M-400M представления в памяти, если мы игнорируем разреженность и адрес по индексу.Симметричная матрица уменьшает это до 25-200M
- Ненулевая плотность в 11% означает, что накладные расходы в 9 элементов для разреженной адресации являются безубыточностью - не очень убедительно для небольших типов данных, но могутбыть опцией для 64-битных типов данных.
Работа с этим дает сильный аргумент двухуровневому решению:
- A (общий) "сервер хранилища данных" (MySQLэто единственный вариант, который вы упомянули)
- и внешний интерфейс (возможно, PHP).
Использование PHP для умножения матриц 500x500 не кажется очень эффективным способом:Затраты на цикл в PHP довольно высоки, поэтому, поскольку в цикле так мало сделано, вы можете потерять немного производительности.
Я рекомендую перейти к немного другому решению: написать свой собственный бэкэнд (возможно, на Cили C #), что
- При запуске считывает матрицу в память
- Прослушивает (локальный) сокет для команд, например, «multiply»
- Выполняет эти командына матрицу и гиven data и возвращает результат
и передает его через PHP.Таким образом вы получаете скорость обработки скомпилированного языка для основной функции, при этом имея простоту и веб-ориентированность PHP для внешнего интерфейса.