У меня есть около 10 МБ данных для отправки из серверной программы в клиентскую программу, обе из которых работают на одном жестком диске.
Сервер написан на C++, а клиент на python.
Я уже создал архитектуру, в которой сервер записывает данные во временные двоичные файлы, а затем отправляет имена файлов через TCP клиенту, чтобы сообщить ему, что данные были записаны в файлы и что теперь они готовы к использованию. получено. И затем клиент python извлекает данные из этих файлов.
Это медленнее, чем я ожидал. Мне было интересно, будет ли это быстрее и использовать меньше памяти, если я просто отправлю данные (в двоичном формате, а не в строку) клиенту напрямую через TCP, а не на запись/чтение файлов?
Предполагая, что ваше программное обеспечение написано для эффективного использования TCP, TCP будет быстрее, поскольку во время передачи TCP данные никогда не нужно будет отправлять на жесткий диск, а затем возвращать обратно. Скорее, он будет оставаться в оперативной памяти все время, а оперативная память намного быстрее, чем вращающийся диск или твердотельный диск.
Отправка данных через TCP также позволяет вашим двум программам работать параллельно, т. е. ваша программа-потребитель может начать потреблять данные еще до того, как ваша программа-производитель закончит их производить. Это может обеспечить некоторое дополнительное ускорение (по сравнению с подходом, при котором читатель не может безопасно читать файлы, пока писатель не закончит их писать).
Если вы не думаете, что когда-либо захотите работать в реальной сети (т.е. ваши две программы всегда будут работать на одном и том же хосте), вы можете рассмотреть возможность использования канала вместо сокета TCP, поскольку это будет немного более эффективным, чем TCP. (Однако TCP-сокет также работает нормально).
(Кстати, еще одна причина избегать подхода с записью временных файлов на диск заключается в том, что вам не нужно беспокоиться о том, что делать, если диск заполнен или доступен только для чтения, или если ваша программа не имеет разрешения на писать в папку, в которую он хочет писать)
Более второстепенный момент: в UNIX-подобной системе доменные сокеты UNIX могут быть, так сказать, полезной промежуточной точкой — они сохраняют (почти) тот же интерфейс, что и другие сокеты, но внутренняя реализация очень похожа на каналы.
Вы не указали свою операционную систему, но могут быть API с общей памятью, которые просто позволят вам передавать данные между двумя процессами.