That's great and that's why tilesheets are good but why do you 'extract' them into single texture each at runtime instead of using sf::VertexArray or sf::Sprite::setTextureRect ?
Load your texture once and then make every sprite/your one huge vertex array use this texture with proper rectangle/coords.
void loadTextures(std::vector<sf::Texture>& texture_list) {
sf::Image master;
master.loadFromFile("Resources/tiles.tga");
for (int x = 0; x < ps::ktexture_grid_size; x++) {
for (int y = 0; y < ps::ktexture_grid_size; y++) {
sf::Texture temp_texture;
temp_texture.loadFromImage(master, sf::IntRect(x * ps::ktexture_size, y * ps::ktexture_size, ps::ktexture_size, ps::ktexture_size));
texture_list.push_back(temp_texture);
}; // for y
}; // for x
} // void loadtextures
The tiles.tga file is loaded into memory, each texture is then created and stored on the gpu and then the image storing tiles.tga is freed.
From the definition of setTextureRect on the sfml documentation, EVERY texture would have to store the WHOLE tiles.tga image on the GPU (using 225 times more gpu memory than loading the textures individually). setTextureRect just modifies which part of the texture that will be drawn, it still keeps the whole texture in memory.