mikedh / trimesh

Python library for loading and using triangular meshes.
https://trimesh.org
MIT License
3.02k stars 583 forks source link

Rtree error in "Index_CreateWithStream": Tools::TemporaryFile: Cannot create temporary file name. #2240

Closed Nicolaus93 closed 5 months ago

Nicolaus93 commented 5 months ago

I'm using trimesh on some big meshes (> 1 million faces). It often happens that when I'm calling mesh.triangles_tree I get the following rtree error: rtree.exceptions.RTreeError: Error in "Index_CreateWithStream": Tools::TemporaryFile: Cannot create temporary file name. This is caused by the rtree library. My guess is that this happens because the rtree is first initialized with default parameters here. This means that the storage will be set to RT_Memory. Probably with big meshes the rtee implementation realizes that it doesn't have enough memory to keep all data and starts writing to a temporary file. Then I get the error for some reason, but unfortunately I wasn't able to fully reproduce the bug yet. I have 2 questions:

Nicolaus93 commented 5 months ago

For anybody facing the same issue. A possible workaround could be to instantiate the rtree outside of trimesh and then store it into the mesh cache

def set_mesh_rtree(mesh: trimesh.Trimesh, tree_path: str) -> None:
    if pathlib.Path(tree_path).exists():
        raise FileExistsError(f"RTree already exists at specified location {tree_path}")
    min_bounds = mesh.triangles.min(axis=1)
    max_bounds = mesh.triangles.max(axis=1)
    bounds = np.column_stack((min_bounds, max_bounds))
    tree = rtree.index.Index(
        tree_path,
        zip(np.arange(len(mesh.faces)), bounds, [None] * len(mesh.faces)),
        properties=rtree.index.Property(dimension=3),
    )
    mesh._cache.cache["triangles_tree"] = tree
Nicolaus93 commented 5 months ago

In the end it was a permission error, similar to https://github.com/Toblerity/rtree/issues/185 The problem with the current version of rtree is that it doesn't write to the /tmp directory but to the current working directory. Hopefully this will be fixed in the next release of rtree - see https://github.com/libspatialindex/libspatialindex/pull/220 (which is included in the latest release of libspatialindex).