pybgpkitstream 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,12 +47,14 @@ def crc32(input_str: str):
47
47
  class BGPKITStream:
48
48
  def __init__(
49
49
  self,
50
- ts_start: datetime.datetime,
51
- ts_end: datetime.datetime,
50
+ ts_start: float,
51
+ ts_end: float,
52
52
  collector_id: str,
53
53
  data_type: list[Literal["update", "rib"]],
54
54
  cache_dir: str | None,
55
55
  filters: dict = {},
56
+ max_concurrent_downloads: int = 10,
57
+ chunk_time: float | None = datetime.timedelta(hours=2).seconds,
56
58
  ):
57
59
  self.ts_start = ts_start
58
60
  self.ts_end = ts_end
@@ -60,6 +62,8 @@ class BGPKITStream:
60
62
  self.data_type = data_type
61
63
  self.cache_dir = cache_dir
62
64
  self.filters = filters
65
+ self.max_concurrent_downloads = max_concurrent_downloads
66
+ self.chunk_time = chunk_time
63
67
 
64
68
  self.broker = bgpkit.Broker()
65
69
 
@@ -129,8 +133,7 @@ class BGPKITStream:
129
133
  self.paths = {"rib": defaultdict(list), "update": defaultdict(list)}
130
134
  tasks = []
131
135
 
132
- CONCURRENT_DOWNLOADS = 10
133
- semaphore = asyncio.Semaphore(CONCURRENT_DOWNLOADS)
136
+ semaphore = asyncio.Semaphore(self.max_concurrent_downloads)
134
137
 
135
138
  conn = aiohttp.TCPConnector()
136
139
  async with aiohttp.ClientSession(connector=conn) as session:
@@ -154,7 +157,7 @@ class BGPKITStream:
154
157
 
155
158
  if tasks:
156
159
  logging.info(
157
- f"Starting download of {len(tasks)} files with a concurrency of {CONCURRENT_DOWNLOADS}..."
160
+ f"Starting download of {len(tasks)} files with a concurrency of {self.max_concurrent_downloads}..."
158
161
  )
159
162
  results = await asyncio.gather(*tasks)
160
163
 
@@ -170,6 +173,35 @@ class BGPKITStream:
170
173
  return ((elem.timestamp, elem, is_rib, collector) for elem in iterator)
171
174
 
172
175
  def __iter__(self) -> Iterator[BGPElement]:
176
+ # Manager mode: spawn smaller worker streams to balance fetch/parse
177
+ if self.chunk_time:
178
+ current = self.ts_start
179
+
180
+ while current < self.ts_end:
181
+ chunk_end = min(current + self.chunk_time, self.ts_end)
182
+
183
+ logging.info(
184
+ f"Processing chunk: {datetime.datetime.fromtimestamp(current)} "
185
+ f"to {datetime.datetime.fromtimestamp(chunk_end)}"
186
+ )
187
+
188
+ worker = type(self)(
189
+ ts_start=current,
190
+ ts_end=chunk_end
191
+ - 1, # remove one second because BGPKIT include border
192
+ collector_id=self.collector_id,
193
+ data_type=self.data_type,
194
+ cache_dir=self.cache_dir,
195
+ filters=self.filters,
196
+ max_concurrent_downloads=self.max_concurrent_downloads,
197
+ chunk_time=None, # Worker doesn't chunk itself
198
+ )
199
+
200
+ yield from worker
201
+ current = chunk_end + 1e-7
202
+
203
+ return
204
+
173
205
  self._set_urls()
174
206
 
175
207
  if self.cache_dir:
@@ -225,4 +257,8 @@ class BGPKITStream:
225
257
  filters=config.filters.model_dump(exclude_unset=True)
226
258
  if config.filters
227
259
  else {},
260
+ max_concurrent_downloads=config.max_concurrent_downloads
261
+ if config.max_concurrent_downloads
262
+ else 10,
263
+ chunk_time=config.chunk_time.seconds if config.chunk_time else None,
228
264
  )
@@ -63,3 +63,10 @@ class BGPStreamConfig(BaseModel):
63
63
  description="Specifies the directory for caching downloaded files.",
64
64
  )
65
65
  filters: FilterOptions | None = Field(default=None, description="Optional filters")
66
+ max_concurrent_downloads: int | None = Field(
67
+ default=None, description="Maximum concurrent downloads when caching"
68
+ )
69
+ chunk_time: datetime.timedelta | None = Field(
70
+ default=datetime.timedelta(hours=2),
71
+ description="Interval for the fetch/parse cycle (avoid long prefetch time)",
72
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pybgpkitstream
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: Drop-in replacement for PyBGPStream using BGPKIT
5
5
  Author: JustinLoye
6
6
  Author-email: JustinLoye <jloye@iij.ad.jp>
@@ -0,0 +1,10 @@
1
+ pybgpkitstream/__init__.py,sha256=kNfv6bvDkaGKjlw0pr9LWVqOQtIGmIPk-VG1ZCBuA38,163
2
+ pybgpkitstream/bgpelement.py,sha256=7mXSUmWThhIbKy2JVsLchoteve0BshT3uH8cdbAe0Go,1176
3
+ pybgpkitstream/bgpkitstream.py,sha256=wJs6c1hs3oZJuPEg4l06MfU8Kz47NmhPngprp3DQ2ws,10100
4
+ pybgpkitstream/bgpstreamconfig.py,sha256=_PHoNhq8lw4QzNKya-KQFQ24dEbTjTkmefFhx0t6K8Q,2873
5
+ pybgpkitstream/cli.py,sha256=E0E1hO0fzGhy1skBopRufdewsiSy_mA-J8Gf2WxBRxo,4214
6
+ pybgpkitstream/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ pybgpkitstream-0.1.3.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
8
+ pybgpkitstream-0.1.3.dist-info/entry_points.txt,sha256=aWhImGlXLtRKkfyJHudcbSp5K5As4ZGL8wXZC0y6q4o,60
9
+ pybgpkitstream-0.1.3.dist-info/METADATA,sha256=M-5bvt3zjpA3IaoqFfiIzdWGgMEfHo16J4u730SRu8Q,2953
10
+ pybgpkitstream-0.1.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.22
2
+ Generator: uv 0.8.24
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,10 +0,0 @@
1
- pybgpkitstream/__init__.py,sha256=kNfv6bvDkaGKjlw0pr9LWVqOQtIGmIPk-VG1ZCBuA38,163
2
- pybgpkitstream/bgpelement.py,sha256=7mXSUmWThhIbKy2JVsLchoteve0BshT3uH8cdbAe0Go,1176
3
- pybgpkitstream/bgpkitstream.py,sha256=pfjfZOlj0Fs1IDKA254sGNEKfFIho55bvxKksPIa-mA,8609
4
- pybgpkitstream/bgpstreamconfig.py,sha256=HD8R6JbVEv9-jBB5LOOCfvaBpPZOfTmBlT3UIXzBX8E,2552
5
- pybgpkitstream/cli.py,sha256=E0E1hO0fzGhy1skBopRufdewsiSy_mA-J8Gf2WxBRxo,4214
6
- pybgpkitstream/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- pybgpkitstream-0.1.1.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
8
- pybgpkitstream-0.1.1.dist-info/entry_points.txt,sha256=aWhImGlXLtRKkfyJHudcbSp5K5As4ZGL8wXZC0y6q4o,60
9
- pybgpkitstream-0.1.1.dist-info/METADATA,sha256=yXhpDEQrepf-YDeXM657WZH48ioSTamRyniZP0EqwNE,2953
10
- pybgpkitstream-0.1.1.dist-info/RECORD,,