mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-09 09:21:46 +00:00
Follow up after 4d688170e0
This commit is contained in:
@@ -299,20 +299,44 @@ def guess_format(path: Path) -> Literal[".ifc", ".ifcZIP", ".ifcXML", ".ifcJSON"
|
||||
return None
|
||||
|
||||
|
||||
def stream2(path: Union[Path, str]):
|
||||
def stream2(path: Union[Path, str], mmap: bool = False, page_size: int = 0):
|
||||
"""Streams the content of a file path from disk, yielding each instance
|
||||
as a dictionary.
|
||||
|
||||
Args:
|
||||
path (Union[Path, str]): input file path
|
||||
mmap (bool): open the file contents using memory mapping
|
||||
page_size (int): open file in python and feed chunks to the parser
|
||||
|
||||
Yields:
|
||||
dict: entity instance dictionaries
|
||||
"""
|
||||
streamer = ifcopenshell_wrapper.InstanceStreamer(str(path))
|
||||
while streamer:
|
||||
if inst := streamer.read_instance_py():
|
||||
yield inst
|
||||
if page_size:
|
||||
import builtins
|
||||
|
||||
f = builtins.open(path, encoding="ascii")
|
||||
strm = ifcopenshell_wrapper.InstanceStreamer()
|
||||
strm.pushPage(f.read(page_size))
|
||||
finished = False
|
||||
while True:
|
||||
while strm.hasSemicolon():
|
||||
if inst := strm.readInstancePy():
|
||||
yield inst
|
||||
else:
|
||||
finished = True
|
||||
break
|
||||
if finished:
|
||||
break
|
||||
else:
|
||||
if data := f.read(page_size):
|
||||
strm.pushPage(data)
|
||||
else:
|
||||
break
|
||||
else:
|
||||
streamer = ifcopenshell_wrapper.InstanceStreamer(str(path), mmap)
|
||||
while streamer:
|
||||
if inst := streamer.readInstancePy():
|
||||
yield inst
|
||||
|
||||
|
||||
def stream2_from_string(data: str):
|
||||
|
||||
@@ -32,6 +32,11 @@ def test_stream():
|
||||
"value": ({"ref": 136}, {"ref": 138}),
|
||||
}
|
||||
|
||||
def test_chunked_stream():
|
||||
assert list(ifcopenshell.stream2(fn)) == list(ifcopenshell.stream2(fn, page_size=1024))
|
||||
|
||||
def test_mmaped_stream():
|
||||
assert list(ifcopenshell.stream2(fn)) == list(ifcopenshell.stream2(fn, mmap=True))
|
||||
|
||||
def test_file():
|
||||
f = ifcopenshell.open(fn)
|
||||
|
||||
Reference in New Issue
Block a user