mikedh / trimesh

Python library for loading and using triangular meshes.

Home Page:https://trimesh.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

Nicolaus93 opened this issue · comments

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:

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

In the end it was a permission error, similar to Toblerity/rtree#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 libspatialindex/libspatialindex#220 (which is included in the latest release of libspatialindex).