我如何拆分一个非常大的 JSONL 文件并将每个部分分配给一个进程
How could I split a very large JSONL file and assign every part to a process
我有一个非常大的 JSONL 文件(14GiB,1200 万行),其中包含世界各地的雷击记录。我想要做的是改进这个数据集,以便最后只保留在德国发生的雷击。文件的每一行都包含一个“笔画”列表,其中包含许多 JSON 个对象(闪电)。它看起来像这样:
"strokes": [
{
"time": 1624230617044,
"lat": 64.298728,
"lon": 44.536694,
"src": 2,
"srv": 2,
"id": 42243883,
"del": 1887,
"dev": 1941
}, #... other items
]
如您所见,由于只给出了纬度和经度,因此不知道雷击发生在哪个国家/地区。必须使用 reverse_geocoder
库才能将一组特定的坐标映射到国家/地区。可以使用的方法如下:
rg.search(strike_location) # strike_location is a tuple that holds the gps coordinate
该方法的输出是一个 json 对象,其中包含国家/地区的 ISO 代码,'DE' 用于德国。
完成此任务的一种方法是逐行遍历文件并过滤数据,结果是对 reverse_geocoder
库的一个查询需要大约。 1.5sc 完成,这使得这种方法真的很慢。
我想到的另一种方法是将文件分成几部分并将每个部分分配给一个特定的进程,比如说 16 个部分,所以我会创建 16 个进程,因为我的计算机上有 16 个 CPU机器。如果这种方法是可能的,那该怎么做呢?或者如果你有什么方法可以改进第一种方法,那将对我有很大帮助。
我认为使用 Dask 会很有用
https://docs.dask.org/en/stable/
只需使用dask.dataframe.read_json方法即可。
另外Dask支持多进程处理,即使是大文件也不用担心,因为Dask是懒加载的。
首先,我假设位置查找是一个网络请求。并行执行这些操作根本不需要太多 CPU,因为它不受您的 CPU 的限制,而是取决于您发送相应请求的速度、让服务处理它们以及返回响应的速度给你。因此,简而言之,有用的并行请求数与您的 CPU 核数无关。
现在,对于 Web 服务的并行请求,您不需要多个进程。使用例如就足够了线程,但如果发出请求的模块提供并行请求支持,您甚至可以不用自己进行线程处理。
也就是说,德国在地理上非常受限。按 min/max 纬度和经度做一个简单的筛选可能已经大大减少了候选人的数量。考虑这样做,特别是如果执行地理映射的服务是免费的,因为您不想滥用他们的资源!
我有一个非常大的 JSONL 文件(14GiB,1200 万行),其中包含世界各地的雷击记录。我想要做的是改进这个数据集,以便最后只保留在德国发生的雷击。文件的每一行都包含一个“笔画”列表,其中包含许多 JSON 个对象(闪电)。它看起来像这样:
"strokes": [
{
"time": 1624230617044,
"lat": 64.298728,
"lon": 44.536694,
"src": 2,
"srv": 2,
"id": 42243883,
"del": 1887,
"dev": 1941
}, #... other items
]
如您所见,由于只给出了纬度和经度,因此不知道雷击发生在哪个国家/地区。必须使用 reverse_geocoder
库才能将一组特定的坐标映射到国家/地区。可以使用的方法如下:
rg.search(strike_location) # strike_location is a tuple that holds the gps coordinate
该方法的输出是一个 json 对象,其中包含国家/地区的 ISO 代码,'DE' 用于德国。
完成此任务的一种方法是逐行遍历文件并过滤数据,结果是对 reverse_geocoder
库的一个查询需要大约。 1.5sc 完成,这使得这种方法真的很慢。
我想到的另一种方法是将文件分成几部分并将每个部分分配给一个特定的进程,比如说 16 个部分,所以我会创建 16 个进程,因为我的计算机上有 16 个 CPU机器。如果这种方法是可能的,那该怎么做呢?或者如果你有什么方法可以改进第一种方法,那将对我有很大帮助。
我认为使用 Dask 会很有用 https://docs.dask.org/en/stable/
只需使用dask.dataframe.read_json方法即可。
另外Dask支持多进程处理,即使是大文件也不用担心,因为Dask是懒加载的。
首先,我假设位置查找是一个网络请求。并行执行这些操作根本不需要太多 CPU,因为它不受您的 CPU 的限制,而是取决于您发送相应请求的速度、让服务处理它们以及返回响应的速度给你。因此,简而言之,有用的并行请求数与您的 CPU 核数无关。
现在,对于 Web 服务的并行请求,您不需要多个进程。使用例如就足够了线程,但如果发出请求的模块提供并行请求支持,您甚至可以不用自己进行线程处理。
也就是说,德国在地理上非常受限。按 min/max 纬度和经度做一个简单的筛选可能已经大大减少了候选人的数量。考虑这样做,特别是如果执行地理映射的服务是免费的,因为您不想滥用他们的资源!