project_bookworm/EverNote_To_OpenAI.ipynb

1500 lines
349 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "18d62071e34b0d53",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"# This is an experiment: create vectorized embeddings out of an EverNote DB (PDF, DOCX, HTML, TXT)\n",
"\n",
"* vectorize text, html files, pdfs and docx into one vector DB, split in tables (sqlite vss)\n",
"* use local self-hosted embeddings (CPU computed)\n",
" * for sentences \n",
"* query a local sqlite vss vector db, use cache from LangChain (sqlite)\n",
"* use OpenAI API and (Ollama op-prem self-hosted) Mistral for the response processing\n",
"* compare with LLMware Bling \n",
"\n",
"Due to cost reasons the OpenAI embeddings don't get used. So sorry :p "
]
},
{
"cell_type": "markdown",
"id": "a8c8692786d83c00",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"## Dependencies\n",
"\n",
"* Cryptography is used to handle some PDF functions here (signatures)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "bb34db1ea75a1edf",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:10:31.827945Z",
"start_time": "2024-03-21T15:10:29.646399Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Name: cryptography\r\n",
"Version: 42.0.5\r\n",
"Summary: cryptography is a package which provides cryptographic recipes and primitives to Python developers.\r\n",
"Home-page: \r\n",
"Author: \r\n",
"Author-email: The Python Cryptographic Authority and individual contributors <cryptography-dev@python.org>\r\n",
"License: Apache-2.0 OR BSD-3-Clause\r\n",
"Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n",
"Requires: cffi\r\n",
"Required-by: \r\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip show cryptography"
]
},
{
"cell_type": "markdown",
"id": "297746c807e95fbf",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"* pikepdf is used to repair some PDFs"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ebc8af0183532fc2",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:12:47.900384Z",
"start_time": "2024-03-21T15:12:45.782477Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Name: pikepdf\r\n",
"Version: 8.13.0\r\n",
"Summary: Read and write PDFs with Python, powered by qpdf\r\n",
"Home-page: \r\n",
"Author: \r\n",
"Author-email: \"James R. Barlow\" <james@purplerock.ca>\r\n",
"License: MPL-2.0\r\n",
"Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n",
"Requires: Deprecated, lxml, packaging, Pillow\r\n",
"Required-by: \r\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip show pikepdf"
]
},
{
"cell_type": "markdown",
"id": "7c7a7f6b0db3719e",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"* pypdf with all features is needed because this DB consists of 100+ PDFs "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "779f81e2ab00f73c",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:17:00.760871Z",
"start_time": "2024-03-21T15:16:58.635484Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Name: pypdf\r\n",
"Version: 4.0.2\r\n",
"Summary: A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files\r\n",
"Home-page: \r\n",
"Author: \r\n",
"Author-email: Mathieu Fenniak <biziqe@mathieu.fenniak.net>\r\n",
"License: \r\n",
"Location: /home/marius/miniconda3/envs/llm_langchain/lib/python3.11/site-packages\r\n",
"Requires: \r\n",
"Required-by: \r\n",
"Note: you may need to restart the kernel to use updated packages.\n"
]
}
],
"source": [
"%pip show \"pypdf\""
]
},
{
"cell_type": "markdown",
"id": "ce1350d2d6e3ed63",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"## Text extraction\n",
"\n",
"* Here the html and text data is extracted into one txt\n",
"* The PDF and DOCX data is extracted into another txt\n",
"* the texts are normalized\n",
"* different encodings get handled\n",
"* difficult files get repaired\n",
"* exceptions get handled (UTF-16 issues, PDF reference errors)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "b557444b8b1d4839",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-17T15:34:05.847778Z",
"start_time": "2024-03-17T15:25:49.787814Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4868/4877 [04:02<00:00, 20.10it/s]\u001b[A\n",
"\n",
"Processing files: 0%| | 1/4877 [00:00<16:09, 5.03it/s]\u001b[A\n",
"Processing files: 5%|███████▎ | 221/4877 [00:00<00:06, 731.58it/s]\u001b[A\n",
"Processing files: 6%|█████████▊ | 301/4877 [00:01<00:30, 149.67it/s]\u001b[A\n",
"Processing files: 7%|███████████▍ | 348/4877 [00:02<00:42, 105.60it/s]\u001b[A\n",
"Processing files: 8%|████████████▍ | 378/4877 [00:03<00:46, 97.05it/s]\u001b[A\n",
"Processing files: 8%|█████████████▏ | 400/4877 [00:03<00:50, 89.38it/s]\u001b[A\n",
"Processing files: 9%|█████████████▊ | 417/4877 [00:04<01:14, 59.57it/s]\u001b[A\n",
"Processing files: 9%|██████████████▏ | 429/4877 [00:04<01:12, 61.35it/s]\u001b[A\n",
"Processing files: 9%|██████████████▌ | 440/4877 [00:04<01:13, 60.08it/s]\u001b[A\n",
"Processing files: 9%|██████████████▊ | 449/4877 [00:04<01:13, 59.90it/s]\u001b[A\n",
"Processing files: 9%|███████████████ | 457/4877 [00:04<01:13, 59.74it/s]\u001b[A\n",
"Processing files: 10%|███████████████▎ | 465/4877 [00:05<01:23, 53.14it/s]\u001b[A\n",
"Processing files: 10%|███████████████▌ | 472/4877 [00:05<01:24, 52.08it/s]\u001b[A\n",
"Processing files: 10%|███████████████▊ | 478/4877 [00:05<01:23, 52.37it/s]\u001b[A\n",
"Processing files: 10%|███████████████▉ | 484/4877 [00:05<01:40, 43.93it/s]\u001b[A\n",
"Processing files: 10%|████████████████▏ | 490/4877 [00:05<01:34, 46.36it/s]\u001b[A\n",
"Processing files: 10%|████████████████▍ | 497/4877 [00:05<01:26, 50.42it/s]\u001b[A\n",
"Processing files: 10%|████████████████▊ | 510/4877 [00:05<01:07, 65.13it/s]\u001b[A\n",
"Processing files: 11%|█████████████████ | 518/4877 [00:06<01:12, 59.99it/s]\u001b[A\n",
"Processing files: 11%|█████████████████▍ | 527/4877 [00:06<01:09, 62.34it/s]\u001b[A\n",
"Processing files: 11%|█████████████████▋ | 534/4877 [00:06<01:25, 50.93it/s]\u001b[A\n",
"Processing files: 11%|█████████████████▊ | 540/4877 [00:06<01:31, 47.22it/s]\u001b[A\n",
"Processing files: 11%|██████████████████ | 546/4877 [00:06<01:29, 48.47it/s]\u001b[A\n",
"Processing files: 11%|██████████████████▏ | 552/4877 [00:06<01:42, 42.22it/s]\u001b[A\n",
"Processing files: 11%|██████████████████▍ | 557/4877 [00:07<01:46, 40.47it/s]\u001b[A\n",
"Processing files: 12%|██████████████████▌ | 562/4877 [00:07<01:46, 40.50it/s]\u001b[A\n",
"Processing files: 12%|██████████████████▋ | 567/4877 [00:07<01:49, 39.28it/s]\u001b[A\n",
"Processing files: 12%|██████████████████▉ | 572/4877 [00:07<01:55, 37.37it/s]\u001b[A\n",
"Processing files: 12%|███████████████████ | 576/4877 [00:07<02:11, 32.80it/s]\u001b[A\n",
"Processing files: 12%|███████████████████▏ | 580/4877 [00:07<02:31, 28.42it/s]\u001b[A\n",
"Processing files: 12%|███████████████████▏ | 583/4877 [00:08<02:36, 27.52it/s]\u001b[A\n",
"Processing files: 12%|███████████████████▎ | 586/4877 [00:08<02:34, 27.77it/s]\u001b[A\n",
"Processing files: 12%|███████████████████▍ | 589/4877 [00:08<03:01, 23.58it/s]\u001b[A\n",
"Processing files: 13%|████████████████████▏ | 612/4877 [00:08<01:03, 67.43it/s]\u001b[A\n",
"Processing files: 13%|████████████████████▍ | 620/4877 [00:08<01:09, 61.13it/s]\u001b[A\n",
"Processing files: 13%|████████████████████▋ | 628/4877 [00:08<01:06, 63.84it/s]\u001b[A\n",
"Processing files: 13%|████████████████████▉ | 636/4877 [00:08<01:23, 51.04it/s]\u001b[A\n",
"Processing files: 13%|█████████████████████▏ | 643/4877 [00:09<01:22, 51.24it/s]\u001b[A\n",
"Processing files: 13%|█████████████████████▌ | 655/4877 [00:09<01:04, 65.29it/s]\u001b[A\n",
"Processing files: 14%|█████████████████████▉ | 665/4877 [00:09<00:59, 70.60it/s]\u001b[A\n",
"Processing files: 14%|██████████████████████▏ | 673/4877 [00:09<02:00, 34.76it/s]\u001b[A\n",
"Processing files: 14%|██████████████████████▍ | 679/4877 [00:09<01:56, 36.01it/s]\u001b[A\n",
"Processing files: 14%|██████████████████████▋ | 688/4877 [00:10<01:37, 42.97it/s]\u001b[A\n",
"Processing files: 14%|██████████████████████▉ | 696/4877 [00:10<01:29, 46.48it/s]\u001b[A\n",
"Processing files: 14%|███████████████████████▏ | 703/4877 [00:10<01:21, 51.02it/s]\u001b[A\n",
"Processing files: 15%|███████████████████████▍ | 710/4877 [00:10<01:18, 52.86it/s]\u001b[A\n",
"Processing files: 15%|███████████████████████▊ | 722/4877 [00:10<01:10, 59.09it/s]\u001b[A\n",
"Processing files: 15%|████████████████████████ | 729/4877 [00:10<01:23, 49.86it/s]\u001b[A\n",
"Processing files: 15%|████████████████████████▎ | 735/4877 [00:10<01:25, 48.25it/s]\u001b[A\n",
"Processing files: 15%|████████████████████████▍ | 741/4877 [00:11<01:27, 47.03it/s]\u001b[A\n",
"Processing files: 15%|████████████████████████▊ | 750/4877 [00:11<01:16, 54.12it/s]\u001b[A\n",
"Processing files: 16%|█████████████████████████ | 758/4877 [00:11<01:09, 59.23it/s]\u001b[A\n",
"Processing files: 16%|█████████████████████████▎ | 766/4877 [00:11<01:07, 60.58it/s]\u001b[A\n",
"Processing files: 16%|█████████████████████████▌ | 773/4877 [00:11<01:29, 45.79it/s]\u001b[A\n",
"Processing files: 16%|█████████████████████████▋ | 780/4877 [00:11<01:21, 50.34it/s]\u001b[A\n",
"Processing files: 16%|██████████████████████████ | 788/4877 [00:11<01:12, 56.10it/s]\u001b[A\n",
"Processing files: 16%|██████████████████████████▌ | 804/4877 [00:12<00:54, 74.41it/s]\u001b[A\n",
"Processing files: 17%|██████████████████████████▊ | 812/4877 [00:12<00:55, 73.20it/s]\u001b[A\n",
"Processing files: 17%|███████████████████████████ | 820/4877 [00:12<00:59, 67.93it/s]\u001b[A\n",
"Processing files: 17%|███████████████████████████▍ | 832/4877 [00:12<00:53, 75.87it/s]\u001b[A\n",
"Processing files: 17%|███████████████████████████▊ | 842/4877 [00:12<00:55, 72.26it/s]\u001b[A\n",
"Processing files: 17%|████████████████████████████ | 850/4877 [00:12<00:55, 72.96it/s]\u001b[A\n",
"Processing files: 18%|████████████████████████████▎ | 858/4877 [00:12<01:04, 62.03it/s]\u001b[A\n",
"Processing files: 18%|████████████████████████████▌ | 865/4877 [00:13<01:20, 49.57it/s]\u001b[A\n",
"Processing files: 18%|████████████████████████████▊ | 871/4877 [00:13<01:19, 50.31it/s]\u001b[A\n",
"Processing files: 18%|████████████████████████████▉ | 877/4877 [00:13<02:17, 29.09it/s]\u001b[A\n",
"Processing files: 18%|█████████████████████████████ | 882/4877 [00:13<02:15, 29.42it/s]\u001b[A\n",
"Processing files: 18%|█████████████████████████████▎ | 887/4877 [00:13<02:03, 32.41it/s]\u001b[A\n",
"Processing files: 18%|█████████████████████████████▍ | 892/4877 [00:14<01:51, 35.60it/s]\u001b[A\n",
"Processing files: 18%|█████████████████████████████▋ | 901/4877 [00:14<01:27, 45.63it/s]\u001b[A\n",
"Processing files: 19%|█████████████████████████████▉ | 907/4877 [00:14<01:34, 42.07it/s]\u001b[A\n",
"Processing files: 19%|██████████████████████████████▎ | 917/4877 [00:14<01:16, 51.43it/s]\u001b[A\n",
"Processing files: 19%|██████████████████████████████▍ | 923/4877 [00:14<01:20, 49.27it/s]\u001b[A\n",
"Processing files: 19%|██████████████████████████████▊ | 934/4877 [00:14<01:07, 58.26it/s]\u001b[A\n",
"Processing files: 19%|███████████████████████████████▏ | 944/4877 [00:14<01:00, 64.53it/s]\u001b[A\n",
"Processing files: 20%|███████████████████████████████▍ | 952/4877 [00:14<01:03, 62.07it/s]\u001b[A\n",
"Processing files: 20%|███████████████████████████████▋ | 959/4877 [00:15<01:01, 63.80it/s]\u001b[A\n",
"Processing files: 20%|███████████████████████████████▉ | 966/4877 [00:15<01:01, 64.05it/s]\u001b[A\n",
"Processing files: 20%|████████████████████████████████▎ | 978/4877 [00:15<00:50, 77.28it/s]\u001b[A\n",
"Processing files: 20%|████████████████████████████████▌ | 986/4877 [00:15<00:54, 71.40it/s]\u001b[A\n",
"Processing files: 20%|████████████████████████████████▊ | 994/4877 [00:15<01:01, 62.73it/s]\u001b[A\n",
"Processing files: 21%|████████████████████████████████▊ | 1001/4877 [00:15<01:07, 57.76it/s]\u001b[A\n",
"Processing files: 21%|█████████████████████████████████▏ | 1011/4877 [00:15<00:57, 67.00it/s]\u001b[A\n",
"Processing files: 21%|█████████████████████████████████▍ | 1019/4877 [00:16<01:10, 54.55it/s]\u001b[A\n",
"Processing files: 21%|█████████████████████████████████▋ | 1028/4877 [00:16<01:04, 59.88it/s]\u001b[A\n",
"Processing files: 21%|█████████████████████████████████▉ | 1035/4877 [00:16<01:03, 60.19it/s]\u001b[A\n",
"Processing files: 21%|██████████████████████████████████▏ | 1043/4877 [00:16<01:01, 62.77it/s]\u001b[A\n",
"Processing files: 22%|██████████████████████████████████▍ | 1050/4877 [00:16<01:18, 48.61it/s]\u001b[A\n",
"Processing files: 22%|██████████████████████████████████▋ | 1057/4877 [00:16<01:11, 53.12it/s]\u001b[A\n",
"Processing files: 22%|██████████████████████████████████▉ | 1065/4877 [00:16<01:04, 59.10it/s]\u001b[A\n",
"Processing files: 22%|███████████████████████████████████▏ | 1072/4877 [00:16<01:03, 59.49it/s]\u001b[A\n",
"Processing files: 22%|███████████████████████████████████▍ | 1079/4877 [00:17<01:06, 57.53it/s]\u001b[A\n",
"Processing files: 22%|███████████████████████████████████▋ | 1086/4877 [00:17<01:13, 51.77it/s]\u001b[A\n",
"Processing files: 22%|███████████████████████████████████▊ | 1092/4877 [00:17<01:13, 51.37it/s]\u001b[A\n",
"Processing files: 23%|████████████████████████████████████ | 1101/4877 [00:17<01:03, 59.28it/s]\u001b[A\n",
"Processing files: 23%|████████████████████████████████████▍ | 1111/4877 [00:17<00:54, 69.29it/s]\u001b[A\n",
"Processing files: 23%|████████████████████████████████████▊ | 1121/4877 [00:17<00:48, 77.41it/s]\u001b[A\n",
"Processing files: 23%|█████████████████████████████████████ | 1130/4877 [00:17<00:48, 76.92it/s]\u001b[A\n",
"Processing files: 23%|█████████████████████████████████████▎ | 1138/4877 [00:17<00:55, 67.09it/s]\u001b[A\n",
"Processing files: 23%|█████████████████████████████████████▌ | 1146/4877 [00:18<00:59, 62.20it/s]\u001b[A\n",
"Processing files: 24%|█████████████████████████████████████▉ | 1155/4877 [00:18<00:56, 65.32it/s]\u001b[A\n",
"Processing files: 24%|██████████████████████████████████████▎ | 1168/4877 [00:18<00:51, 72.04it/s]\u001b[A\n",
"Processing files: 24%|██████████████████████████████████████▋ | 1179/4877 [00:18<00:46, 80.16it/s]\u001b[A\n",
"Processing files: 24%|██████████████████████████████████████▉ | 1188/4877 [00:18<00:45, 80.44it/s]\u001b[A\n",
"Processing files: 25%|███████████████████████████████████████▎ | 1197/4877 [00:18<01:09, 52.60it/s]\u001b[A\n",
"Processing files: 25%|███████████████████████████████████████▍ | 1204/4877 [00:19<01:53, 32.25it/s]\u001b[A\n",
"Processing files: 25%|███████████████████████████████████████▋ | 1211/4877 [00:19<01:41, 35.97it/s]\u001b[A\n",
"Processing files: 25%|███████████████████████████████████████▉ | 1217/4877 [00:19<01:53, 32.33it/s]\u001b[A\n",
"Processing files: 25%|████████████████████████████████████████ | 1223/4877 [00:19<01:40, 36.22it/s]\u001b[A\n",
"Processing files: 25%|████████████████████████████████████████▎ | 1228/4877 [00:20<01:41, 36.05it/s]\u001b[A\n",
"Processing files: 25%|████████████████████████████████████████▍ | 1233/4877 [00:20<01:47, 33.76it/s]\u001b[A\n",
"Processing files: 25%|████████████████████████████████████████▌ | 1237/4877 [00:20<01:51, 32.69it/s]\u001b[A\n",
"Processing files: 25%|████████████████████████████████████████▋ | 1241/4877 [00:20<02:31, 24.04it/s]\u001b[A\n",
"Processing files: 26%|████████████████████████████████████████▉ | 1248/4877 [00:20<01:57, 30.88it/s]\u001b[A\n",
"Processing files: 26%|█████████████████████████████████████████▏ | 1254/4877 [00:20<01:41, 35.67it/s]\u001b[A\n",
"Processing files: 26%|█████████████████████████████████████████▎ | 1259/4877 [00:20<01:34, 38.20it/s]\u001b[A\n",
"Processing files: 26%|█████████████████████████████████████████▍ | 1264/4877 [00:21<01:32, 39.10it/s]\u001b[A\n",
"Processing files: 26%|█████████████████████████████████████████▋ | 1270/4877 [00:21<01:23, 43.01it/s]\u001b[A\n",
"Processing files: 26%|█████████████████████████████████████████▉ | 1280/4877 [00:21<01:06, 54.33it/s]\u001b[A\n",
"Processing files: 26%|██████████████████████████████████████████▎ | 1288/4877 [00:21<01:01, 58.46it/s]\u001b[A\n",
"Processing files: 27%|██████████████████████████████████████████▋ | 1300/4877 [00:21<00:51, 69.19it/s]\u001b[A\n",
"Processing files: 27%|██████████████████████████████████████████▉ | 1308/4877 [00:21<00:52, 68.36it/s]\u001b[A\n",
"Processing files: 27%|███████████████████████████████████████████▏ | 1315/4877 [00:21<00:58, 60.84it/s]\u001b[A\n",
"Processing files: 27%|███████████████████████████████████████████▎ | 1322/4877 [00:22<01:06, 53.52it/s]\u001b[A\n",
"Processing files: 27%|███████████████████████████████████████████▋ | 1333/4877 [00:22<00:55, 63.33it/s]\u001b[A\n",
"Processing files: 27%|███████████████████████████████████████████▉ | 1340/4877 [00:22<00:56, 62.99it/s]\u001b[A\n",
"Processing files: 28%|████████████████████████████████████████████▍ | 1353/4877 [00:22<00:46, 75.10it/s]\u001b[A\n",
"Processing files: 28%|████████████████████████████████████████████▋ | 1363/4877 [00:22<00:45, 76.91it/s]\u001b[A\n",
"Processing files: 28%|████████████████████████████████████████████▉ | 1371/4877 [00:22<00:45, 76.29it/s]\u001b[A\n",
"Processing files: 28%|█████████████████████████████████████████████▏ | 1379/4877 [00:22<00:53, 65.70it/s]\u001b[A\n",
"Processing files: 28%|█████████████████████████████████████████████▍ | 1386/4877 [00:23<01:12, 48.21it/s]\u001b[A\n",
"Processing files: 29%|█████████████████████████████████████████████▊ | 1395/4877 [00:23<01:03, 55.12it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████ | 1403/4877 [00:23<01:08, 50.81it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████▏ | 1409/4877 [00:23<01:23, 41.51it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████▍ | 1414/4877 [00:23<01:23, 41.53it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████▌ | 1419/4877 [00:23<01:26, 40.12it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████▋ | 1424/4877 [00:23<01:31, 37.60it/s]\u001b[A\n",
"Processing files: 29%|██████████████████████████████████████████████▊ | 1428/4877 [00:24<02:07, 27.00it/s]\u001b[A\n",
"Processing files: 29%|███████████████████████████████████████████████ | 1433/4877 [00:24<02:01, 28.36it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▏ | 1440/4877 [00:24<01:38, 34.76it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▎ | 1444/4877 [00:24<01:35, 35.82it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▌ | 1450/4877 [00:24<01:34, 36.07it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▋ | 1454/4877 [00:25<01:58, 28.94it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▊ | 1458/4877 [00:25<02:07, 26.78it/s]\u001b[A\n",
"Processing files: 30%|███████████████████████████████████████████████▉ | 1461/4877 [00:25<02:18, 24.65it/s]\u001b[A\n",
"Processing files: 30%|████████████████████████████████████████████████ | 1464/4877 [00:25<02:30, 22.67it/s]\u001b[A\n",
"Processing files: 30%|████████████████████████████████████████████████▏ | 1467/4877 [00:25<02:37, 21.69it/s]\u001b[A\n",
"Processing files: 30%|████████████████████████████████████████████████▏ | 1470/4877 [00:25<02:42, 21.03it/s]\u001b[A\n",
"Processing files: 30%|████████████████████████████████████████████████▎ | 1474/4877 [00:26<02:23, 23.64it/s]\u001b[A\n",
"Processing files: 30%|████████████████████████████████████████████████▋ | 1484/4877 [00:26<01:28, 38.17it/s]\u001b[A\n",
"Processing files: 31%|████████████████████████████████████████████████▉ | 1491/4877 [00:26<01:17, 43.96it/s]\u001b[A\n",
"Processing files: 31%|█████████████████████████████████████████████████▏ | 1498/4877 [00:26<01:09, 48.90it/s]\u001b[A\n",
"Processing files: 31%|█████████████████████████████████████████████████▌ | 1512/4877 [00:26<00:48, 69.68it/s]\u001b[A\n",
"Processing files: 31%|█████████████████████████████████████████████████▊ | 1520/4877 [00:26<00:59, 56.57it/s]\u001b[A\n",
"Processing files: 31%|██████████████████████████████████████████████████▏ | 1530/4877 [00:26<00:51, 64.71it/s]\u001b[A\n",
"Processing files: 32%|██████████████████████████████████████████████████▍ | 1538/4877 [00:26<00:51, 64.27it/s]\u001b[A\n",
"Processing files: 32%|██████████████████████████████████████████████████▊ | 1550/4877 [00:27<00:43, 75.69it/s]\u001b[A\n",
"Processing files: 32%|███████████████████████████████████████████████████▏ | 1559/4877 [00:27<00:52, 63.56it/s]\u001b[A\n",
"Processing files: 32%|███████████████████████████████████████████████████▍ | 1568/4877 [00:27<00:49, 66.67it/s]\u001b[A\n",
"Processing files: 32%|███████████████████████████████████████████████████▋ | 1576/4877 [00:27<00:49, 66.62it/s]\u001b[A\n",
"Processing files: 33%|████████████████████████████████████████████████████▏ | 1589/4877 [00:27<00:41, 78.87it/s]\u001b[A\n",
"Processing files: 33%|████████████████████████████████████████████████████▍ | 1599/4877 [00:27<00:41, 78.68it/s]\u001b[A\n",
"Processing files: 33%|████████████████████████████████████████████████████▊ | 1608/4877 [00:27<00:42, 77.05it/s]\u001b[A\n",
"Processing files: 33%|█████████████████████████████████████████████████████ | 1616/4877 [00:28<00:50, 64.42it/s]\u001b[A\n",
"Processing files: 33%|█████████████████████████████████████████████████████▍ | 1627/4877 [00:28<00:48, 66.45it/s]\u001b[A\n",
"Processing files: 34%|█████████████████████████████████████████████████████▌ | 1634/4877 [00:28<00:58, 55.22it/s]\u001b[A\n",
"Processing files: 34%|█████████████████████████████████████████████████████▊ | 1640/4877 [00:28<01:02, 51.41it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████ | 1646/4877 [00:29<01:49, 29.63it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████▏ | 1651/4877 [00:29<02:03, 26.04it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████▎ | 1655/4877 [00:29<02:33, 21.01it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████▍ | 1658/4877 [00:29<02:27, 21.85it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████▌ | 1664/4877 [00:29<01:58, 27.16it/s]\u001b[A\n",
"Processing files: 34%|██████████████████████████████████████████████████████▉ | 1674/4877 [00:29<01:22, 38.69it/s]\u001b[A\n",
"Processing files: 35%|███████████████████████████████████████████████████████▎ | 1686/4877 [00:30<01:00, 52.93it/s]\u001b[A\n",
"Processing files: 35%|███████████████████████████████████████████████████████▋ | 1697/4877 [00:30<00:51, 61.43it/s]\u001b[A\n",
"Processing files: 35%|███████████████████████████████████████████████████████▉ | 1705/4877 [00:30<00:49, 64.31it/s]\u001b[A\n",
"Processing files: 35%|████████████████████████████████████████████████████████▎ | 1716/4877 [00:30<00:43, 72.88it/s]\u001b[A\n",
"Processing files: 35%|████████████████████████████████████████████████████████▌ | 1724/4877 [00:30<00:47, 66.66it/s]\u001b[A\n",
"Processing files: 36%|████████████████████████████████████████████████████████▊ | 1732/4877 [00:30<00:52, 59.58it/s]\u001b[A\n",
"Processing files: 36%|█████████████████████████████████████████████████████████ | 1740/4877 [00:30<00:50, 62.31it/s]\u001b[A\n",
"Processing files: 36%|█████████████████████████████████████████████████████████▍ | 1750/4877 [00:30<00:47, 65.83it/s]\u001b[A\n",
"Processing files: 36%|█████████████████████████████████████████████████████████▋ | 1757/4877 [00:31<00:47, 65.33it/s]\u001b[A\n",
"Processing files: 36%|█████████████████████████████████████████████████████████▊ | 1764/4877 [00:31<00:54, 57.02it/s]\u001b[A\n",
"Processing files: 36%|██████████████████████████████████████████████████████████ | 1770/4877 [00:31<00:55, 56.05it/s]\u001b[A\n",
"Processing files: 36%|██████████████████████████████████████████████████████████▎ | 1776/4877 [00:31<01:01, 50.62it/s]\u001b[A\n",
"Processing files: 37%|██████████████████████████████████████████████████████████▍ | 1782/4877 [00:31<01:06, 46.20it/s]\u001b[A\n",
"Processing files: 37%|██████████████████████████████████████████████████████████▋ | 1787/4877 [00:32<01:38, 31.34it/s]\u001b[A\n",
"Processing files: 37%|██████████████████████████████████████████████████████████▊ | 1791/4877 [00:32<01:35, 32.45it/s]\u001b[A\n",
"Processing files: 37%|██████████████████████████████████████████████████████████▉ | 1795/4877 [00:32<02:14, 22.91it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████ | 1799/4877 [00:32<02:25, 21.13it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████ | 1802/4877 [00:32<02:16, 22.47it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████▏ | 1806/4877 [00:33<02:17, 22.30it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████▎ | 1809/4877 [00:33<02:12, 23.14it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████▌ | 1817/4877 [00:33<01:34, 32.26it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████▋ | 1821/4877 [00:33<01:44, 29.26it/s]\u001b[A\n",
"Processing files: 37%|███████████████████████████████████████████████████████████▊ | 1825/4877 [00:33<01:40, 30.46it/s]\u001b[A\n",
"Processing files: 38%|████████████████████████████████████████████████████████████▎ | 1837/4877 [00:33<01:12, 41.98it/s]\u001b[A\n",
"Processing files: 38%|████████████████████████████████████████████████████████████▍ | 1843/4877 [00:33<01:06, 45.75it/s]\u001b[A\n",
"Processing files: 38%|████████████████████████████████████████████████████████████▋ | 1848/4877 [00:33<01:05, 46.47it/s]\u001b[A\n",
"Processing files: 38%|████████████████████████████████████████████████████████████▊ | 1853/4877 [00:34<01:17, 39.26it/s]\u001b[A\n",
"Processing files: 38%|████████████████████████████████████████████████████████████▉ | 1858/4877 [00:34<01:19, 37.89it/s]\u001b[A\n",
"Processing files: 38%|█████████████████████████████████████████████████████████████ | 1862/4877 [00:34<01:24, 35.72it/s]\u001b[A\n",
"Processing files: 38%|█████████████████████████████████████████████████████████████▏ | 1866/4877 [00:34<01:33, 32.09it/s]\u001b[A\n",
"Processing files: 38%|█████████████████████████████████████████████████████████████▎ | 1870/4877 [00:34<01:50, 27.24it/s]\u001b[A\n",
"Processing files: 38%|█████████████████████████████████████████████████████████████▍ | 1873/4877 [00:34<02:07, 23.62it/s]\u001b[A\n",
"Processing files: 38%|█████████████████████████████████████████████████████████████▌ | 1876/4877 [00:35<02:01, 24.66it/s]\u001b[A\n",
"Processing files: 39%|█████████████████████████████████████████████████████████████▋ | 1882/4877 [00:35<01:37, 30.80it/s]\u001b[A\n",
"Processing files: 39%|██████████████████████████████████████████████████████████████ | 1892/4877 [00:35<01:04, 46.25it/s]\u001b[A\n",
"Processing files: 39%|██████████████████████████████████████████████████████████████▎ | 1901/4877 [00:35<00:53, 56.07it/s]\u001b[A\n",
"Processing files: 39%|██████████████████████████████████████████████████████████████▌ | 1908/4877 [00:35<00:52, 56.30it/s]\u001b[A\n",
"Processing files: 39%|██████████████████████████████████████████████████████████████▊ | 1915/4877 [00:35<00:54, 54.27it/s]\u001b[A\n",
"Processing files: 39%|███████████████████████████████████████████████████████████████ | 1921/4877 [00:35<00:56, 52.77it/s]\u001b[A\n",
"Processing files: 40%|███████████████████████████████████████████████████████████████▏ | 1927/4877 [00:35<01:01, 48.00it/s]\u001b[A\n",
"Processing files: 40%|███████████████████████████████████████████████████████████████▌ | 1937/4877 [00:36<00:51, 57.28it/s]\u001b[A\n",
"Processing files: 40%|███████████████████████████████████████████████████████████████▋ | 1943/4877 [00:36<00:51, 57.05it/s]\u001b[A\n",
"Processing files: 40%|███████████████████████████████████████████████████████████████▉ | 1949/4877 [00:36<00:58, 50.29it/s]\u001b[A\n",
"Processing files: 40%|████████████████████████████████████████████████████████████████▏ | 1955/4877 [00:36<00:57, 50.95it/s]\u001b[A\n",
"Processing files: 40%|████████████████████████████████████████████████████████████████▎ | 1961/4877 [00:36<01:00, 47.99it/s]\u001b[A\n",
"Processing files: 40%|████████████████████████████████████████████████████████████████▍ | 1966/4877 [00:36<01:07, 43.36it/s]\u001b[A\n",
"Processing files: 40%|████████████████████████████████████████████████████████████████▋ | 1971/4877 [00:36<01:20, 36.12it/s]\u001b[A\n",
"Processing files: 41%|████████████████████████████████████████████████████████████████▉ | 1978/4877 [00:37<01:10, 41.09it/s]\u001b[A\n",
"Processing files: 41%|█████████████████████████████████████████████████████████████████ | 1983/4877 [00:37<01:11, 40.68it/s]\u001b[A\n",
"Processing files: 41%|█████████████████████████████████████████████████████████████████▏ | 1988/4877 [00:37<01:30, 32.09it/s]\u001b[A\n",
"Processing files: 41%|█████████████████████████████████████████████████████████████████▎ | 1992/4877 [00:37<01:52, 25.63it/s]\u001b[A\n",
"Processing files: 41%|█████████████████████████████████████████████████████████████████▌ | 1997/4877 [00:37<01:39, 28.86it/s]\u001b[A\n",
"Processing files: 41%|█████████████████████████████████████████████████████████████████▋ | 2004/4877 [00:37<01:18, 36.37it/s]\u001b[A\n",
"Processing files: 41%|██████████████████████████████████████████████████████████████████ | 2012/4877 [00:37<01:03, 45.22it/s]\u001b[A\n",
"Processing files: 41%|██████████████████████████████████████████████████████████████████▎ | 2022/4877 [00:38<00:49, 57.77it/s]\u001b[A\n",
"Processing files: 42%|██████████████████████████████████████████████████████████████████▊ | 2035/4877 [00:38<00:41, 68.86it/s]\u001b[A\n",
"Processing files: 42%|███████████████████████████████████████████████████████████████████ | 2043/4877 [00:38<00:46, 60.83it/s]\u001b[A\n",
"Processing files: 42%|███████████████████████████████████████████████████████████████████▎ | 2050/4877 [00:38<00:46, 61.24it/s]\u001b[A\n",
"Processing files: 42%|███████████████████████████████████████████████████████████████████▍ | 2057/4877 [00:38<00:45, 62.20it/s]\u001b[A\n",
"Processing files: 42%|███████████████████████████████████████████████████████████████████▋ | 2064/4877 [00:39<01:15, 37.48it/s]\u001b[A\n",
"Processing files: 42%|███████████████████████████████████████████████████████████████████▉ | 2070/4877 [00:39<01:21, 34.36it/s]\u001b[A\n",
"Processing files: 43%|████████████████████████████████████████████████████████████████████ | 2075/4877 [00:39<01:19, 35.32it/s]\u001b[A\n",
"Processing files: 43%|████████████████████████████████████████████████████████████████████▎ | 2082/4877 [00:39<01:11, 39.16it/s]\u001b[A\n",
"Processing files: 43%|████████████████████████████████████████████████████████████████████▋ | 2092/4877 [00:39<00:55, 50.48it/s]\u001b[A\n",
"Processing files: 43%|████████████████████████████████████████████████████████████████████▉ | 2100/4877 [00:39<00:50, 55.51it/s]\u001b[A\n",
"Processing files: 43%|█████████████████████████████████████████████████████████████████████▏ | 2110/4877 [00:39<00:43, 63.74it/s]\u001b[A\n",
"Processing files: 43%|█████████████████████████████████████████████████████████████████████▌ | 2119/4877 [00:39<00:39, 69.68it/s]\u001b[A\n",
"Processing files: 44%|█████████████████████████████████████████████████████████████████████▊ | 2127/4877 [00:40<00:56, 48.98it/s]\u001b[A\n",
"Processing files: 44%|██████████████████████████████████████████████████████████████████████ | 2134/4877 [00:40<00:51, 53.13it/s]\u001b[A\n",
"Processing files: 44%|██████████████████████████████████████████████████████████████████████▏ | 2141/4877 [00:40<00:56, 48.60it/s]\u001b[A\n",
"Processing files: 44%|██████████████████████████████████████████████████████████████████████▌ | 2150/4877 [00:40<00:48, 56.70it/s]\u001b[A\n",
"Processing files: 44%|██████████████████████████████████████████████████████████████████████▉ | 2164/4877 [00:40<00:36, 73.84it/s]\u001b[A\n",
"Processing files: 45%|███████████████████████████████████████████████████████████████████████▍ | 2178/4877 [00:40<00:32, 84.30it/s]\u001b[A\n",
"Processing files: 45%|███████████████████████████████████████████████████████████████████████▊ | 2188/4877 [00:40<00:34, 77.53it/s]\u001b[A\n",
"Processing files: 45%|████████████████████████████████████████████████████████████████████████ | 2197/4877 [00:41<00:35, 75.97it/s]\u001b[A\n",
"Processing files: 45%|████████████████████████████████████████████████████████████████████████▎ | 2206/4877 [00:41<00:35, 74.56it/s]\u001b[A\n",
"Processing files: 45%|████████████████████████████████████████████████████████████████████████▋ | 2214/4877 [00:41<00:39, 66.69it/s]\u001b[A\n",
"Processing files: 46%|████████████████████████████████████████████████████████████████████████▊ | 2221/4877 [00:41<00:39, 66.91it/s]\u001b[A\n",
"Processing files: 46%|█████████████████████████████████████████████████████████████████████████ | 2228/4877 [00:41<00:42, 62.19it/s]\u001b[A\n",
"Processing files: 46%|█████████████████████████████████████████████████████████████████████████▎ | 2235/4877 [00:41<00:43, 61.30it/s]\u001b[A\n",
"Processing files: 46%|█████████████████████████████████████████████████████████████████████████▊ | 2248/4877 [00:41<00:33, 77.70it/s]\u001b[A\n",
"Processing files: 46%|██████████████████████████████████████████████████████████████████████████ | 2258/4877 [00:41<00:31, 82.44it/s]\u001b[A\n",
"Processing files: 46%|██████████████████████████████████████████████████████████████████████████▎ | 2267/4877 [00:42<00:39, 66.16it/s]\u001b[A\n",
"Processing files: 47%|██████████████████████████████████████████████████████████████████████████▋ | 2275/4877 [00:42<00:43, 60.00it/s]\u001b[A\n",
"Processing files: 47%|██████████████████████████████████████████████████████████████████████████▊ | 2282/4877 [00:42<01:00, 43.00it/s]\u001b[A\n",
"Processing files: 47%|███████████████████████████████████████████████████████████████████████████ | 2288/4877 [00:42<01:00, 43.00it/s]\u001b[A\n",
"Processing files: 47%|███████████████████████████████████████████████████████████████████████████▏ | 2293/4877 [00:43<01:34, 27.46it/s]\u001b[A\n",
"Processing files: 47%|███████████████████████████████████████████████████████████████████████████▍ | 2300/4877 [00:43<01:17, 33.11it/s]\u001b[A\n",
"Processing files: 47%|███████████████████████████████████████████████████████████████████████████▋ | 2308/4877 [00:43<01:03, 40.50it/s]\u001b[A\n",
"Processing files: 47%|███████████████████████████████████████████████████████████████████████████▉ | 2315/4877 [00:43<00:56, 45.56it/s]\u001b[A\n",
"Processing files: 48%|████████████████████████████████████████████████████████████████████████████▏ | 2321/4877 [00:43<01:02, 40.93it/s]\u001b[A\n",
"Processing files: 48%|████████████████████████████████████████████████████████████████████████████▍ | 2331/4877 [00:43<00:48, 52.78it/s]\u001b[A\n",
"Processing files: 48%|████████████████████████████████████████████████████████████████████████████▋ | 2338/4877 [00:43<00:46, 54.25it/s]\u001b[A\n",
"Processing files: 48%|█████████████████████████████████████████████████████████████████████████████ | 2349/4877 [00:44<00:38, 65.44it/s]\u001b[A\n",
"Processing files: 48%|█████████████████████████████████████████████████████████████████████████████▎ | 2357/4877 [00:44<00:44, 56.47it/s]\u001b[A\n",
"Processing files: 48%|█████████████████████████████████████████████████████████████████████████████▌ | 2365/4877 [00:44<00:41, 60.46it/s]\u001b[A\n",
"Processing files: 49%|█████████████████████████████████████████████████████████████████████████████▊ | 2372/4877 [00:44<00:51, 48.86it/s]\u001b[A\n",
"Processing files: 49%|██████████████████████████████████████████████████████████████████████████████ | 2378/4877 [00:44<00:53, 46.32it/s]\u001b[A\n",
"Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▏ | 2385/4877 [00:44<00:49, 50.68it/s]\u001b[A\n",
"Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▌ | 2394/4877 [00:44<00:45, 54.87it/s]\u001b[A\n",
"Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▋ | 2400/4877 [00:45<01:05, 37.96it/s]\u001b[A\n",
"Processing files: 49%|██████████████████████████████████████████████████████████████████████████████▉ | 2405/4877 [00:45<01:02, 39.45it/s]\u001b[A\n",
"Processing files: 49%|███████████████████████████████████████████████████████████████████████████████ | 2410/4877 [00:45<01:01, 40.42it/s]\u001b[A\n",
"Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▏ | 2415/4877 [00:46<03:26, 11.95it/s]\u001b[A\n",
"Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▍ | 2423/4877 [00:46<02:21, 17.32it/s]\u001b[A\n",
"Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▊ | 2431/4877 [00:46<01:43, 23.53it/s]\u001b[A\n",
"Processing files: 50%|███████████████████████████████████████████████████████████████████████████████▉ | 2438/4877 [00:47<01:24, 28.89it/s]\u001b[A\n",
"Processing files: 50%|████████████████████████████████████████████████████████████████████████████████▎ | 2449/4877 [00:47<00:59, 40.65it/s]\u001b[A\n",
"Processing files: 51%|████████████████████████████████████████████████████████████████████████████████▊ | 2463/4877 [00:47<00:42, 57.21it/s]\u001b[A\n",
"Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████ | 2472/4877 [00:47<00:41, 58.55it/s]\u001b[A\n",
"Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▎ | 2480/4877 [00:47<00:39, 60.15it/s]\u001b[A\n",
"Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▌ | 2488/4877 [00:47<00:38, 61.60it/s]\u001b[A\n",
"Processing files: 51%|█████████████████████████████████████████████████████████████████████████████████▉ | 2496/4877 [00:47<00:40, 59.09it/s]\u001b[A\n",
"Processing files: 51%|██████████████████████████████████████████████████████████████████████████████████ | 2503/4877 [00:47<00:39, 60.83it/s]\u001b[A\n",
"Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▍ | 2512/4877 [00:48<00:36, 65.61it/s]\u001b[A\n",
"Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▋ | 2520/4877 [00:48<00:35, 66.93it/s]\u001b[A\n",
"Processing files: 52%|██████████████████████████████████████████████████████████████████████████████████▉ | 2528/4877 [00:48<00:34, 67.38it/s]\u001b[A\n",
"Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▏ | 2535/4877 [00:48<00:34, 66.97it/s]\u001b[A\n",
"Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▍ | 2544/4877 [00:48<00:33, 69.41it/s]\u001b[A\n",
"Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▋ | 2552/4877 [00:48<00:37, 61.81it/s]\u001b[A\n",
"Processing files: 52%|███████████████████████████████████████████████████████████████████████████████████▉ | 2559/4877 [00:48<00:41, 56.48it/s]\u001b[A\n",
"Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▏ | 2567/4877 [00:48<00:41, 55.52it/s]\u001b[A\n",
"Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▍ | 2573/4877 [00:49<00:45, 51.10it/s]\u001b[A\n",
"Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▌ | 2579/4877 [00:49<00:52, 43.79it/s]\u001b[A\n",
"Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▊ | 2585/4877 [00:49<00:51, 44.53it/s]\u001b[A\n",
"Processing files: 53%|████████████████████████████████████████████████████████████████████████████████████▉ | 2590/4877 [00:49<00:57, 39.51it/s]\u001b[A\n",
"Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▏ | 2595/4877 [00:49<01:02, 36.29it/s]\u001b[A\n",
"Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▎ | 2601/4877 [00:49<00:56, 40.29it/s]\u001b[A\n",
"Processing files: 53%|█████████████████████████████████████████████████████████████████████████████████████▍ | 2606/4877 [00:50<01:23, 27.22it/s]\u001b[A\n",
"Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▋ | 2610/4877 [00:50<01:44, 21.62it/s]\u001b[A\n",
"Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▋ | 2613/4877 [00:50<01:45, 21.44it/s]\u001b[A\n",
"Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▊ | 2617/4877 [00:50<01:42, 22.07it/s]\u001b[A\n",
"Processing files: 54%|█████████████████████████████████████████████████████████████████████████████████████▉ | 2621/4877 [00:50<01:29, 25.15it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████ | 2625/4877 [00:51<01:40, 22.47it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▎ | 2630/4877 [00:51<01:29, 25.01it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▍ | 2633/4877 [00:51<02:10, 17.21it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▌ | 2639/4877 [00:51<01:42, 21.78it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▋ | 2643/4877 [00:52<01:38, 22.70it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▊ | 2646/4877 [00:52<01:40, 22.28it/s]\u001b[A\n",
"Processing files: 54%|██████████████████████████████████████████████████████████████████████████████████████▉ | 2649/4877 [00:52<01:51, 20.03it/s]\u001b[A\n",
"Processing files: 54%|███████████████████████████████████████████████████████████████████████████████████████ | 2652/4877 [00:52<01:47, 20.72it/s]\u001b[A\n",
"Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▏ | 2659/4877 [00:52<01:25, 26.09it/s]\u001b[A\n",
"Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▍ | 2667/4877 [00:52<01:02, 35.22it/s]\u001b[A\n",
"Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▋ | 2671/4877 [00:52<01:03, 35.01it/s]\u001b[A\n",
"Processing files: 55%|███████████████████████████████████████████████████████████████████████████████████████▉ | 2679/4877 [00:53<00:49, 44.20it/s]\u001b[A\n",
"Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████ | 2684/4877 [00:53<00:51, 42.67it/s]\u001b[A\n",
"Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████▎ | 2691/4877 [00:53<00:45, 48.57it/s]\u001b[A\n",
"Processing files: 55%|████████████████████████████████████████████████████████████████████████████████████████▍ | 2697/4877 [00:53<00:45, 47.62it/s]\u001b[A\n",
"Processing files: 56%|████████████████████████████████████████████████████████████████████████████████████████▉ | 2710/4877 [00:53<00:32, 67.02it/s]\u001b[A\n",
"Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▏ | 2718/4877 [00:53<00:50, 42.46it/s]\u001b[A\n",
"Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▎ | 2724/4877 [00:53<00:48, 44.40it/s]\u001b[A\n",
"Processing files: 56%|█████████████████████████████████████████████████████████████████████████████████████████▊ | 2736/4877 [00:54<00:36, 59.21it/s]\u001b[A\n",
"Processing files: 56%|██████████████████████████████████████████████████████████████████████████████████████████ | 2744/4877 [00:54<00:43, 49.30it/s]\u001b[A\n",
"Processing files: 56%|██████████████████████████████████████████████████████████████████████████████████████████▎ | 2751/4877 [00:54<00:57, 36.92it/s]\u001b[A\n",
"Processing files: 57%|██████████████████████████████████████████████████████████████████████████████████████████▌ | 2760/4877 [00:54<00:47, 44.60it/s]\u001b[A\n",
"Processing files: 57%|██████████████████████████████████████████████████████████████████████████████████████████▉ | 2771/4877 [00:54<00:37, 55.99it/s]\u001b[A\n",
"Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▏ | 2781/4877 [00:54<00:34, 60.94it/s]\u001b[A\n",
"Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▌ | 2791/4877 [00:55<00:30, 67.42it/s]\u001b[A\n",
"Processing files: 57%|███████████████████████████████████████████████████████████████████████████████████████████▊ | 2799/4877 [00:55<00:31, 66.33it/s]\u001b[A\n",
"Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████ | 2807/4877 [00:55<00:30, 67.29it/s]\u001b[A\n",
"Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▍ | 2816/4877 [00:55<00:30, 68.59it/s]\u001b[A\n",
"Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▋ | 2824/4877 [00:55<00:40, 51.28it/s]\u001b[A\n",
"Processing files: 58%|████████████████████████████████████████████████████████████████████████████████████████████▉ | 2834/4877 [00:55<00:36, 56.31it/s]\u001b[A\n",
"Processing files: 58%|█████████████████████████████████████████████████████████████████████████████████████████████▏ | 2841/4877 [00:56<00:51, 39.57it/s]\u001b[A\n",
"Processing files: 58%|█████████████████████████████████████████████████████████████████████████████████████████████▌ | 2850/4877 [00:56<00:43, 46.57it/s]\u001b[A\n",
"Processing files: 59%|█████████████████████████████████████████████████████████████████████████████████████████████▋ | 2857/4877 [00:56<00:39, 50.98it/s]\u001b[A\n",
"Processing files: 59%|█████████████████████████████████████████████████████████████████████████████████████████████▉ | 2864/4877 [00:56<00:50, 40.17it/s]\u001b[A\n",
"Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▏ | 2870/4877 [00:56<00:46, 43.09it/s]\u001b[A\n",
"Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▎ | 2876/4877 [00:56<00:49, 40.45it/s]\u001b[A\n",
"Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▋ | 2886/4877 [00:57<00:38, 51.58it/s]\u001b[A\n",
"Processing files: 59%|██████████████████████████████████████████████████████████████████████████████████████████████▉ | 2893/4877 [00:57<00:39, 50.15it/s]\u001b[A\n",
"Processing files: 59%|███████████████████████████████████████████████████████████████████████████████████████████████ | 2899/4877 [00:57<00:48, 40.81it/s]\u001b[A\n",
"Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▎ | 2906/4877 [00:57<00:43, 45.38it/s]\u001b[A\n",
"Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▌ | 2913/4877 [00:57<00:39, 50.11it/s]\u001b[A\n",
"Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▊ | 2919/4877 [00:57<00:39, 49.92it/s]\u001b[A\n",
"Processing files: 60%|███████████████████████████████████████████████████████████████████████████████████████████████▉ | 2925/4877 [00:57<00:40, 47.94it/s]\u001b[A\n",
"Processing files: 60%|████████████████████████████████████████████████████████████████████████████████████████████████▏ | 2931/4877 [00:58<00:52, 37.38it/s]\u001b[A\n",
"Processing files: 60%|████████████████████████████████████████████████████████████████████████████████████████████████▌ | 2943/4877 [00:58<00:36, 52.53it/s]\u001b[A\n",
"Processing files: 61%|████████████████████████████████████████████████████████████████████████████████████████████████▊ | 2952/4877 [00:58<00:32, 58.79it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████ | 2959/4877 [00:58<00:34, 55.31it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▎ | 2966/4877 [00:58<00:42, 44.77it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▌ | 2972/4877 [00:59<00:46, 41.26it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▋ | 2977/4877 [00:59<00:59, 32.08it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▊ | 2981/4877 [00:59<01:07, 28.10it/s]\u001b[A\n",
"Processing files: 61%|█████████████████████████████████████████████████████████████████████████████████████████████████▉ | 2985/4877 [00:59<01:09, 27.18it/s]\u001b[A\n",
"Processing files: 61%|██████████████████████████████████████████████████████████████████████████████████████████████████ | 2990/4877 [00:59<01:00, 31.32it/s]\u001b[A\n",
"Processing files: 61%|██████████████████████████████████████████████████████████████████████████████████████████████████▎ | 2997/4877 [00:59<00:48, 38.96it/s]\u001b[A\n",
"Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3004/4877 [00:59<00:41, 44.92it/s]\u001b[A\n",
"Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3010/4877 [01:00<00:47, 39.57it/s]\u001b[A\n",
"Processing files: 62%|██████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3015/4877 [01:00<00:46, 40.19it/s]\u001b[A\n",
"Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3026/4877 [01:00<00:33, 55.80it/s]\u001b[A\n",
"Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3035/4877 [01:00<00:29, 62.35it/s]\u001b[A\n",
"Processing files: 62%|███████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3042/4877 [01:00<00:32, 56.07it/s]\u001b[A\n",
"Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████ | 3049/4877 [01:00<00:32, 57.00it/s]\u001b[A\n",
"Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3056/4877 [01:00<00:30, 59.29it/s]\u001b[A\n",
"Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3065/4877 [01:00<00:30, 59.39it/s]\u001b[A\n",
"Processing files: 63%|████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3072/4877 [01:01<00:34, 52.86it/s]\u001b[A\n",
"Processing files: 63%|█████████████████████████████████████████████████████████████████████████████████████████████████████ | 3082/4877 [01:01<00:29, 61.06it/s]\u001b[A\n",
"Processing files: 63%|█████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3093/4877 [01:01<00:25, 70.27it/s]\u001b[A\n",
"Processing files: 64%|█████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3101/4877 [01:01<00:24, 71.88it/s]\u001b[A\n",
"Processing files: 64%|█████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3109/4877 [01:01<00:24, 71.52it/s]\u001b[A\n",
"Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3117/4877 [01:01<00:24, 73.27it/s]\u001b[A\n",
"Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3125/4877 [01:01<00:29, 59.03it/s]\u001b[A\n",
"Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3132/4877 [01:02<00:31, 56.11it/s]\u001b[A\n",
"Processing files: 64%|██████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3138/4877 [01:02<00:33, 51.69it/s]\u001b[A\n",
"Processing files: 64%|███████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3144/4877 [01:02<00:40, 42.55it/s]\u001b[A\n",
"Processing files: 65%|███████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3151/4877 [01:02<00:38, 44.87it/s]\u001b[A\n",
"Processing files: 65%|███████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3165/4877 [01:02<00:26, 63.44it/s]\u001b[A\n",
"Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3176/4877 [01:02<00:24, 70.74it/s]\u001b[A\n",
"Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3185/4877 [01:02<00:24, 69.97it/s]\u001b[A\n",
"Processing files: 65%|████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3193/4877 [01:03<00:25, 66.42it/s]\u001b[A\n",
"Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3202/4877 [01:03<00:23, 71.42it/s]\u001b[A\n",
"Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3210/4877 [01:03<00:25, 64.16it/s]\u001b[A\n",
"Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3217/4877 [01:03<00:31, 52.18it/s]\u001b[A\n",
"Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3223/4877 [01:03<00:46, 35.52it/s]\u001b[A\n",
"Processing files: 66%|█████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3229/4877 [01:03<00:41, 39.37it/s]\u001b[A\n",
"Processing files: 66%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3241/4877 [01:04<00:30, 53.55it/s]\u001b[A\n",
"Processing files: 67%|██████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3254/4877 [01:04<00:23, 68.02it/s]\u001b[A\n",
"Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3263/4877 [01:04<00:23, 70.01it/s]\u001b[A\n",
"Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3271/4877 [01:04<00:32, 48.80it/s]\u001b[A\n",
"Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3279/4877 [01:04<00:29, 53.59it/s]\u001b[A\n",
"Processing files: 67%|███████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3286/4877 [01:04<00:28, 56.55it/s]\u001b[A\n",
"Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3296/4877 [01:04<00:24, 65.30it/s]\u001b[A\n",
"Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3305/4877 [01:05<00:22, 68.40it/s]\u001b[A\n",
"Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3313/4877 [01:05<00:22, 70.71it/s]\u001b[A\n",
"Processing files: 68%|████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3321/4877 [01:05<00:27, 55.90it/s]\u001b[A\n",
"Processing files: 68%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3328/4877 [01:05<00:37, 40.92it/s]\u001b[A\n",
"Processing files: 68%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3334/4877 [01:06<00:53, 28.86it/s]\u001b[A\n",
"Processing files: 69%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3343/4877 [01:06<00:40, 37.55it/s]\u001b[A\n",
"Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3357/4877 [01:06<00:28, 54.22it/s]\u001b[A\n",
"Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3367/4877 [01:06<00:24, 62.64it/s]\u001b[A\n",
"Processing files: 69%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3377/4877 [01:06<00:22, 66.00it/s]\u001b[A\n",
"Processing files: 69%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3387/4877 [01:06<00:20, 72.89it/s]\u001b[A\n",
"Processing files: 70%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3398/4877 [01:06<00:19, 76.09it/s]\u001b[A\n",
"Processing files: 70%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3407/4877 [01:07<00:35, 41.29it/s]\u001b[A\n",
"Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3415/4877 [01:07<00:31, 45.93it/s]\u001b[A\n",
"Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3428/4877 [01:07<00:25, 56.90it/s]\u001b[A\n",
"Processing files: 70%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3436/4877 [01:07<00:33, 43.56it/s]\u001b[A\n",
"Processing files: 71%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3442/4877 [01:08<00:34, 41.44it/s]\u001b[A\n",
"Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3450/4877 [01:08<00:30, 47.49it/s]\u001b[A\n",
"Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3456/4877 [01:08<00:37, 38.09it/s]\u001b[A\n",
"Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3461/4877 [01:08<00:38, 37.05it/s]\u001b[A\n",
"Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3466/4877 [01:08<00:36, 38.21it/s]\u001b[A\n",
"Processing files: 71%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3471/4877 [01:08<00:35, 39.63it/s]\u001b[A\n",
"Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3476/4877 [01:08<00:41, 33.86it/s]\u001b[A\n",
"Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3480/4877 [01:09<00:41, 33.89it/s]\u001b[A\n",
"Processing files: 71%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3486/4877 [01:09<00:36, 38.05it/s]\u001b[A\n",
"Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3491/4877 [01:09<00:35, 38.51it/s]\u001b[A\n",
"Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3497/4877 [01:09<00:33, 41.61it/s]\u001b[A\n",
"Processing files: 72%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3504/4877 [01:09<00:28, 47.61it/s]\u001b[A\n",
"Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3509/4877 [01:09<00:32, 41.57it/s]\u001b[A\n",
"Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3516/4877 [01:09<00:28, 46.94it/s]\u001b[A\n",
"Processing files: 72%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3533/4877 [01:09<00:18, 71.33it/s]\u001b[A\n",
"Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3541/4877 [01:10<00:18, 72.63it/s]\u001b[A\n",
"Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3549/4877 [01:10<00:18, 72.75it/s]\u001b[A\n",
"Processing files: 73%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3560/4877 [01:10<00:16, 81.78it/s]\u001b[A\n",
"Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3569/4877 [01:10<00:17, 74.52it/s]\u001b[A\n",
"Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3577/4877 [01:10<00:19, 65.90it/s]\u001b[A\n",
"Processing files: 73%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3584/4877 [01:10<00:24, 53.22it/s]\u001b[A\n",
"Processing files: 74%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3590/4877 [01:10<00:27, 47.13it/s]\u001b[A\n",
"Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3597/4877 [01:11<00:25, 50.56it/s]\u001b[A\n",
"Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3603/4877 [01:11<00:29, 43.26it/s]\u001b[A\n",
"Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3612/4877 [01:11<00:25, 49.21it/s]\u001b[A\n",
"Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3619/4877 [01:11<00:30, 41.01it/s]\u001b[A\n",
"Processing files: 74%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3624/4877 [01:11<00:32, 38.41it/s]\u001b[A\n",
"Processing files: 74%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3629/4877 [01:12<00:43, 28.93it/s]\u001b[A\n",
"Processing files: 74%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3633/4877 [01:12<00:43, 28.32it/s]\u001b[A\n",
"Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3637/4877 [01:12<00:40, 30.33it/s]\u001b[A\n",
"Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3641/4877 [01:12<00:40, 30.59it/s]\u001b[A\n",
"Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3645/4877 [01:12<00:44, 27.44it/s]\u001b[A\n",
"Processing files: 75%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3653/4877 [01:12<00:32, 38.11it/s]\u001b[A\n",
"Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3659/4877 [01:12<00:29, 40.89it/s]\u001b[A\n",
"Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3664/4877 [01:13<00:36, 33.42it/s]\u001b[A\n",
"Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3668/4877 [01:13<00:35, 34.45it/s]\u001b[A\n",
"Processing files: 75%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3677/4877 [01:13<00:25, 46.32it/s]\u001b[A\n",
"Processing files: 76%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3688/4877 [01:13<00:23, 51.56it/s]\u001b[A\n",
"Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 3700/4877 [01:13<00:19, 60.77it/s]\u001b[A\n",
"Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3708/4877 [01:13<00:17, 65.09it/s]\u001b[A\n",
"Processing files: 76%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3715/4877 [01:13<00:17, 65.78it/s]\u001b[A\n",
"Processing files: 76%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3723/4877 [01:14<00:19, 59.34it/s]\u001b[A\n",
"Processing files: 76%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3730/4877 [01:14<00:20, 57.08it/s]\u001b[A\n",
"Processing files: 77%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3736/4877 [01:14<00:20, 55.68it/s]\u001b[A\n",
"Processing files: 77%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3744/4877 [01:14<00:18, 60.10it/s]\u001b[A\n",
"Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3753/4877 [01:14<00:18, 62.12it/s]\u001b[A\n",
"Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3765/4877 [01:14<00:15, 74.08it/s]\u001b[A\n",
"Processing files: 77%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3774/4877 [01:14<00:15, 69.54it/s]\u001b[A\n",
"Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3782/4877 [01:14<00:16, 66.79it/s]\u001b[A\n",
"Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3790/4877 [01:15<00:16, 65.00it/s]\u001b[A\n",
"Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3797/4877 [01:15<00:17, 60.76it/s]\u001b[A\n",
"Processing files: 78%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3809/4877 [01:15<00:14, 74.13it/s]\u001b[A\n",
"Processing files: 78%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3818/4877 [01:15<00:14, 72.79it/s]\u001b[A\n",
"Processing files: 78%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3827/4877 [01:15<00:13, 76.95it/s]\u001b[A\n",
"Processing files: 79%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3837/4877 [01:15<00:12, 81.41it/s]\u001b[A\n",
"Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3847/4877 [01:15<00:12, 80.45it/s]\u001b[A\n",
"Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3856/4877 [01:15<00:13, 74.25it/s]\u001b[A\n",
"Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3864/4877 [01:16<00:15, 66.42it/s]\u001b[A\n",
"Processing files: 79%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3871/4877 [01:16<00:23, 43.61it/s]\u001b[A\n",
"Processing files: 79%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3877/4877 [01:16<00:22, 44.16it/s]\u001b[A\n",
"Processing files: 80%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3889/4877 [01:16<00:17, 57.98it/s]\u001b[A\n",
"Processing files: 80%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3896/4877 [01:16<00:16, 59.50it/s]\u001b[A\n",
"Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3903/4877 [01:16<00:19, 50.56it/s]\u001b[A\n",
"Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3909/4877 [01:17<00:19, 50.91it/s]\u001b[A\n",
"Processing files: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3920/4877 [01:17<00:15, 60.35it/s]\u001b[A\n",
"Processing files: 81%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 3927/4877 [01:17<00:17, 53.46it/s]\u001b[A\n",
"Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3935/4877 [01:17<00:16, 57.04it/s]\u001b[A\n",
"Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 3942/4877 [01:17<00:15, 58.79it/s]\u001b[A\n",
"Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3954/4877 [01:17<00:13, 70.97it/s]\u001b[A\n",
"Processing files: 81%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 3962/4877 [01:17<00:15, 59.37it/s]\u001b[A\n",
"Processing files: 81%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3969/4877 [01:18<00:16, 54.87it/s]\u001b[A\n",
"Processing files: 82%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 3978/4877 [01:18<00:14, 62.21it/s]\u001b[A\n",
"Processing files: 82%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3985/4877 [01:18<00:15, 59.21it/s]\u001b[A\n",
"Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 3997/4877 [01:18<00:13, 67.54it/s]\u001b[A\n",
"Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4005/4877 [01:18<00:12, 68.06it/s]\u001b[A\n",
"Processing files: 82%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4017/4877 [01:18<00:10, 79.89it/s]\u001b[A\n",
"Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4026/4877 [01:18<00:10, 82.11it/s]\u001b[A\n",
"Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4038/4877 [01:18<00:09, 87.58it/s]\u001b[A\n",
"Processing files: 83%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4052/4877 [01:18<00:08, 92.68it/s]\u001b[A\n",
"Processing files: 83%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4062/4877 [01:19<00:08, 93.45it/s]\u001b[A\n",
"Processing files: 83%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4072/4877 [01:19<00:10, 73.42it/s]\u001b[A\n",
"Processing files: 84%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4081/4877 [01:19<00:12, 62.43it/s]\u001b[A\n",
"Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4089/4877 [01:19<00:12, 65.25it/s]\u001b[A\n",
"Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4097/4877 [01:19<00:12, 60.43it/s]\u001b[A\n",
"Processing files: 84%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4106/4877 [01:19<00:11, 66.33it/s]\u001b[A\n",
"Processing files: 84%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4115/4877 [01:19<00:10, 70.09it/s]\u001b[A\n",
"Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4125/4877 [01:20<00:10, 74.37it/s]\u001b[A\n",
"Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4133/4877 [01:20<00:10, 71.00it/s]\u001b[A\n",
"Processing files: 85%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4141/4877 [01:20<00:15, 46.67it/s]\u001b[A\n",
"Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4147/4877 [01:20<00:14, 49.00it/s]\u001b[A\n",
"Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4155/4877 [01:20<00:13, 55.13it/s]\u001b[A\n",
"Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4162/4877 [01:20<00:15, 46.99it/s]\u001b[A\n",
"Processing files: 85%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4169/4877 [01:21<00:13, 51.71it/s]\u001b[A\n",
"Processing files: 86%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4175/4877 [01:21<00:13, 51.51it/s]\u001b[A\n",
"Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4181/4877 [01:21<00:13, 53.27it/s]\u001b[A\n",
"Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4188/4877 [01:21<00:12, 53.04it/s]\u001b[A\n",
"Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4194/4877 [01:21<00:13, 48.82it/s]\u001b[A\n",
"Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4200/4877 [01:21<00:14, 47.73it/s]\u001b[A\n",
"Processing files: 86%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4205/4877 [01:21<00:14, 45.10it/s]\u001b[A\n",
"Processing files: 86%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4213/4877 [01:21<00:13, 50.33it/s]\u001b[A\n",
"Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4219/4877 [01:22<00:13, 50.39it/s]\u001b[A\n",
"Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4225/4877 [01:22<00:12, 52.12it/s]\u001b[A\n",
"Processing files: 87%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4231/4877 [01:22<00:12, 53.16it/s]\u001b[A\n",
"Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4238/4877 [01:22<00:13, 46.93it/s]\u001b[A\n",
"Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4243/4877 [01:22<00:15, 40.90it/s]\u001b[A\n",
"Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4253/4877 [01:22<00:12, 50.13it/s]\u001b[A\n",
"Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4259/4877 [01:23<00:15, 40.54it/s]\u001b[A\n",
"Processing files: 87%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4264/4877 [01:23<00:16, 37.16it/s]\u001b[A\n",
"Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4269/4877 [01:23<00:15, 39.52it/s]\u001b[A\n",
"Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4274/4877 [01:23<00:15, 38.76it/s]\u001b[A\n",
"Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4286/4877 [01:23<00:10, 55.81it/s]\u001b[A\n",
"Processing files: 88%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4293/4877 [01:23<00:12, 45.66it/s]\u001b[A\n",
"Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4299/4877 [01:23<00:15, 38.10it/s]\u001b[A\n",
"Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4304/4877 [01:24<00:14, 39.54it/s]\u001b[A\n",
"Processing files: 88%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4309/4877 [01:24<00:13, 40.89it/s]\u001b[A\n",
"Processing files: 89%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4322/4877 [01:24<00:09, 59.74it/s]\u001b[A\n",
"Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4331/4877 [01:24<00:08, 66.52it/s]\u001b[A\n",
"Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4339/4877 [01:24<00:07, 67.29it/s]\u001b[A\n",
"Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4347/4877 [01:24<00:07, 67.23it/s]\u001b[A\n",
"Processing files: 89%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4356/4877 [01:24<00:07, 66.35it/s]\u001b[A\n",
"Processing files: 89%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4363/4877 [01:25<00:09, 56.20it/s]\u001b[A\n",
"Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4370/4877 [01:25<00:08, 56.37it/s]\u001b[A\n",
"Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4376/4877 [01:25<00:09, 54.55it/s]\u001b[A\n",
"Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4382/4877 [01:25<00:10, 47.58it/s]\u001b[A\n",
"Processing files: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4388/4877 [01:25<00:09, 50.01it/s]\u001b[A\n",
"Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4394/4877 [01:25<00:11, 42.43it/s]\u001b[A\n",
"Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4402/4877 [01:25<00:09, 50.23it/s]\u001b[A\n",
"Processing files: 90%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4411/4877 [01:26<00:12, 38.18it/s]\u001b[A\n",
"Processing files: 91%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4416/4877 [01:27<00:28, 16.28it/s]\u001b[A\n",
"Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4424/4877 [01:27<00:20, 21.93it/s]\u001b[A\n",
"Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4436/4877 [01:27<00:14, 31.38it/s]\u001b[A\n",
"Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4444/4877 [01:27<00:11, 36.24it/s]\u001b[A\n",
"Processing files: 91%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4450/4877 [01:27<00:14, 30.46it/s]\u001b[A\n",
"Processing files: 91%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4455/4877 [01:27<00:12, 33.17it/s]\u001b[A\n",
"Processing files: 91%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4460/4877 [01:28<00:13, 30.88it/s]\u001b[A\n",
"Processing files: 92%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4471/4877 [01:28<00:09, 44.17it/s]\u001b[A\n",
"Processing files: 92%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4477/4877 [01:28<00:10, 38.92it/s]\u001b[A\n",
"Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4485/4877 [01:28<00:08, 46.59it/s]\u001b[A\n",
"Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4491/4877 [01:28<00:08, 47.89it/s]\u001b[A\n",
"Processing files: 92%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4508/4877 [01:28<00:04, 75.12it/s]\u001b[A\n",
"Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4517/4877 [01:28<00:05, 63.65it/s]\u001b[A\n",
"Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4525/4877 [01:29<00:05, 64.78it/s]\u001b[A\n",
"Processing files: 93%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4534/4877 [01:29<00:05, 68.25it/s]\u001b[A\n",
"Processing files: 93%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4548/4877 [01:29<00:03, 85.29it/s]\u001b[A\n",
"Processing files: 93%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4558/4877 [01:29<00:03, 83.73it/s]\u001b[A\n",
"Processing files: 94%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4570/4877 [01:29<00:03, 90.24it/s]\u001b[A\n",
"Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4580/4877 [01:29<00:03, 86.85it/s]\u001b[A\n",
"Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4590/4877 [01:29<00:03, 77.73it/s]\u001b[A\n",
"Processing files: 94%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4599/4877 [01:30<00:05, 55.07it/s]\u001b[A\n",
"Processing files: 94%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4606/4877 [01:30<00:07, 38.39it/s]\u001b[A\n",
"Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4612/4877 [01:30<00:06, 41.53it/s]\u001b[A\n",
"Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4621/4877 [01:30<00:05, 49.55it/s]\u001b[A\n",
"Processing files: 95%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4628/4877 [01:30<00:04, 51.50it/s]\u001b[A\n",
"Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4641/4877 [01:30<00:03, 65.01it/s]\u001b[A\n",
"Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4649/4877 [01:31<00:04, 53.61it/s]\u001b[A\n",
"Processing files: 95%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4656/4877 [01:31<00:03, 56.60it/s]\u001b[A\n",
"Processing files: 96%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4663/4877 [01:31<00:04, 51.69it/s]\u001b[A\n",
"Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4675/4877 [01:31<00:03, 64.86it/s]\u001b[A\n",
"Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4683/4877 [01:31<00:02, 64.94it/s]\u001b[A\n",
"Processing files: 96%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4691/4877 [01:31<00:02, 64.90it/s]\u001b[A\n",
"Processing files: 96%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4698/4877 [01:31<00:03, 52.37it/s]\u001b[A\n",
"Processing files: 96%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4704/4877 [01:32<00:04, 41.00it/s]\u001b[A\n",
"Processing files: 97%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4711/4877 [01:32<00:03, 44.31it/s]\u001b[A\n",
"Processing files: 97%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4721/4877 [01:32<00:02, 52.76it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4730/4877 [01:32<00:02, 58.76it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4737/4877 [01:32<00:02, 55.67it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4743/4877 [01:32<00:02, 48.62it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4749/4877 [01:37<00:28, 4.55it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4753/4877 [01:43<01:00, 2.04it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4754/4877 [01:58<01:00, 2.04it/s]\u001b[A\n",
"Processing files: 97%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4755/4877 [02:02<03:12, 1.58s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4756/4877 [02:08<03:52, 1.92s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4758/4877 [02:08<03:09, 1.60s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4760/4877 [02:09<02:41, 1.38s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4762/4877 [02:13<02:51, 1.49s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4763/4877 [02:17<03:23, 1.79s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4764/4877 [02:17<02:57, 1.58s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4765/4877 [02:18<02:29, 1.33s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4766/4877 [02:18<02:11, 1.18s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4767/4877 [02:18<01:45, 1.05it/s]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4768/4877 [02:19<01:43, 1.06it/s]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4769/4877 [02:26<04:19, 2.40s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4770/4877 [02:28<04:00, 2.25s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4771/4877 [02:31<04:20, 2.46s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4772/4877 [02:31<03:24, 1.95s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4773/4877 [02:33<03:23, 1.96s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4774/4877 [02:35<03:28, 2.03s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4775/4877 [02:36<02:32, 1.49s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4776/4877 [02:37<02:29, 1.48s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4777/4877 [02:39<02:39, 1.59s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4778/4877 [02:39<01:58, 1.19s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4779/4877 [02:42<02:56, 1.80s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4780/4877 [02:43<02:26, 1.51s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4781/4877 [02:45<02:42, 1.70s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4782/4877 [02:48<03:14, 2.05s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4783/4877 [02:52<04:00, 2.56s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4784/4877 [02:52<02:57, 1.91s/it]\u001b[A\n",
"Processing files: 98%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4785/4877 [02:54<02:55, 1.91s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4786/4877 [02:55<02:14, 1.48s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4787/4877 [02:56<01:51, 1.24s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4788/4877 [02:56<01:22, 1.08it/s]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4789/4877 [03:00<02:54, 1.99s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4791/4877 [03:02<02:10, 1.52s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4792/4877 [03:03<01:58, 1.39s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4793/4877 [03:04<01:41, 1.20s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4794/4877 [03:05<01:39, 1.20s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4795/4877 [03:07<01:50, 1.35s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4796/4877 [03:10<02:28, 1.84s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4797/4877 [03:12<02:29, 1.86s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4798/4877 [03:14<02:30, 1.91s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4799/4877 [03:15<02:11, 1.69s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4800/4877 [03:17<02:10, 1.70s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4801/4877 [03:17<01:48, 1.42s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4802/4877 [03:18<01:39, 1.33s/it]\u001b[A\n",
"Processing files: 98%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4803/4877 [03:22<02:35, 2.10s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4804/4877 [03:24<02:23, 1.97s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4805/4877 [03:26<02:17, 1.92s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4807/4877 [03:31<02:31, 2.16s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4808/4877 [03:32<02:05, 1.82s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4809/4877 [03:32<01:39, 1.46s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4810/4877 [03:33<01:22, 1.23s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4811/4877 [03:34<01:32, 1.40s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4812/4877 [03:42<03:29, 3.22s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4813/4877 [03:42<02:31, 2.36s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4814/4877 [03:43<01:58, 1.88s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4815/4877 [03:51<03:49, 3.69s/it]\u001b[A\n",
"Processing files: 99%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4816/4877 [03:54<03:24, 3.35s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4817/4877 [03:59<03:57, 3.96s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4818/4877 [04:00<02:54, 2.96s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4819/4877 [04:01<02:20, 2.43s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4821/4877 [04:06<02:16, 2.43s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4822/4877 [04:09<02:28, 2.70s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 4823/4877 [04:12<02:23, 2.65s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4825/4877 [04:17<02:18, 2.67s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4826/4877 [04:20<02:18, 2.72s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎ | 4827/4877 [04:21<01:49, 2.18s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4828/4877 [04:23<01:46, 2.17s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4829/4877 [04:23<01:23, 1.74s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4830/4877 [04:34<03:11, 4.08s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍ | 4831/4877 [04:39<03:32, 4.63s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4832/4877 [04:40<02:30, 3.33s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4833/4877 [04:40<01:52, 2.56s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4834/4877 [04:43<01:49, 2.54s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌ | 4835/4877 [04:52<03:04, 4.39s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4836/4877 [04:52<02:08, 3.14s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4837/4877 [04:53<01:40, 2.52s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 4838/4877 [04:54<01:23, 2.15s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4839/4877 [04:56<01:19, 2.08s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4840/4877 [04:58<01:18, 2.11s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4841/4877 [05:00<01:14, 2.08s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊ | 4842/4877 [05:01<01:03, 1.82s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4843/4877 [05:03<01:03, 1.88s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4844/4877 [05:04<00:50, 1.53s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4845/4877 [05:05<00:44, 1.40s/it]\u001b[A\n",
"Processing files: 99%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉ | 4846/4877 [05:09<01:01, 1.98s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4847/4877 [05:10<00:58, 1.94s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4848/4877 [05:12<00:54, 1.86s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4849/4877 [05:13<00:48, 1.72s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 4850/4877 [05:15<00:47, 1.75s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4851/4877 [05:17<00:46, 1.77s/it]\u001b[A\n",
"Processing files: 99%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4852/4877 [05:19<00:43, 1.73s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4853/4877 [05:27<01:30, 3.78s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏| 4854/4877 [05:28<01:06, 2.90s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4855/4877 [05:30<00:53, 2.44s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4856/4877 [05:36<01:13, 3.52s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▎| 4857/4877 [05:46<01:51, 5.55s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4858/4877 [05:51<01:42, 5.38s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4859/4877 [05:53<01:20, 4.48s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4860/4877 [06:07<02:05, 7.36s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▍| 4861/4877 [06:11<01:37, 6.10s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4862/4877 [06:25<02:09, 8.66s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4863/4877 [06:33<01:56, 8.35s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4864/4877 [06:43<01:55, 8.88s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 4865/4877 [06:50<01:39, 8.33s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4866/4877 [06:51<01:07, 6.16s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4867/4877 [06:52<00:47, 4.70s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4868/4877 [06:55<00:36, 4.04s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋| 4869/4877 [07:13<01:06, 8.37s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4870/4877 [07:15<00:45, 6.45s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4871/4877 [07:16<00:27, 4.61s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4872/4877 [07:17<00:18, 3.69s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▊| 4873/4877 [07:20<00:13, 3.26s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4874/4877 [07:21<00:08, 2.81s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4875/4877 [07:42<00:16, 8.24s/it]\u001b[A\n",
"Processing files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▉| 4876/4877 [07:46<00:06, 6.88s/it]\u001b[A\n",
"Processing files: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4877/4877 [08:15<00:00, 9.83it/s]\u001b[A\n"
]
}
],
"source": [
"import glob\n",
"import os\n",
"from concurrent.futures import ThreadPoolExecutor\n",
"import unicodedata # to normalize text\n",
"import html2text # to convert html to text\n",
"from langchain.document_loaders import PyPDFLoader, Docx2txtLoader\n",
"import pikepdf # to repair PDFs\n",
"from pathlib import Path\n",
"from tqdm.notebook import tqdm\n",
"from concurrent.futures import ThreadPoolExecutor, as_completed\n",
"\n",
"# todo: hardcoded paths\n",
"output_path = \"/home/marius/source/bookworm/export.txt\"\n",
"\n",
"def convert_html_to_text(html_blob: str) -> str:\n",
" \"\"\"\n",
" Converts a html blob into a string.\n",
" \"\"\"\n",
" h = html2text.HTML2Text()\n",
" h.mark_code = True\n",
" h.escape_snob = True\n",
" h.unicode_snob = True\n",
" # h.use_automatic_links = True \n",
" h.images_as_html = True\n",
" h.single_line_break = True\n",
" h.ignore_links = True\n",
" return h.handle(html_blob)\n",
"\n",
"def normalize_text(txt_blob: str) -> str:\n",
" \"\"\"\n",
" Normalize a text blob using NFKD normalization.\n",
" \"\"\"\n",
" return unicodedata.normalize(\"NFKD\", txt_blob)\n",
"\n",
"def repair_pdf(file_path: str) -> bool:\n",
" \"\"\"\n",
" Attempts to repair a PDF file using pikepdf.\n",
" \"\"\"\n",
" try:\n",
" with pikepdf.open(file_path, allow_overwriting_input=True) as pdf:\n",
" pdf.save(file_path)\n",
" return True\n",
" except pikepdf.PdfError as e:\n",
" print(f\"Failed to repair PDF {file_path}: {e}\")\n",
" return False\n",
"\n",
"def read_and_convert_file(file_path: str, is_html: bool, is_pdf: bool, is_docx: bool) -> str:\n",
" \"\"\"\n",
" Reads and converts a file from HTML, PDF, DOCX, or plain text to text.\n",
" \"\"\"\n",
" content = \"\"\n",
" if is_html:\n",
" try:\n",
" with open(file_path, 'r', encoding='utf-8') as file:\n",
" content = file.read()\n",
" return convert_html_to_text(content)\n",
" except Exception as e:\n",
" print(f\"Error reading {file_path}: {e}\")\n",
" return \"\"\n",
"\n",
" elif is_pdf:\n",
" try:\n",
" loader = PyPDFLoader(file_path)\n",
" # ... fixes \"Multiple definitions in dictionary at byte 0xb32 for key /ExtGState\" error\n",
" documents = loader.load()\n",
" content = \"\\n\".join(doc.page_content for doc in documents if hasattr(doc, 'page_content'))\n",
" except Exception as e:\n",
" print(f\"Error loading PDF {file_path}: {e}. Attempting to repair...\")\n",
" if repair_pdf(file_path):\n",
" try:\n",
" loader = PyPDFLoader(file_path)\n",
" documents = loader.load()\n",
" content = \"\\n\".join(doc.page_content for doc in documents if hasattr(doc, 'page_content'))\n",
" except Exception as e:\n",
" print(f\"Failed to process PDF {file_path} after repair: {e}\")\n",
" return \"\"\n",
" return normalize_text(content)\n",
"\n",
" elif is_docx:\n",
" try:\n",
" loader = Docx2txtLoader(file_path)\n",
" content = loader.load()\n",
" if isinstance(content, list):\n",
" content = \"\\n\".join(content)\n",
" except Exception as e:\n",
" print(f\"Error reading DOCX {file_path}: {e}\")\n",
" return \"\"\n",
" return normalize_text(content)\n",
"\n",
" else: # For plain text files\n",
" try:\n",
" with open(file_path, 'r', encoding='utf-8') as file:\n",
" return normalize_text(file.read())\n",
" except Exception as e:\n",
" print(f\"Error reading {file_path}: {e}\")\n",
" return \"\"\n",
"\n",
"def sanitize_text(text):\n",
" \"\"\"\n",
" Removes or replaces surrogate characters from a string.\n",
" \"\"\"\n",
" return text.encode('utf-8', 'replace').decode('utf-8')\n",
"\n",
"def append_to_output(data: str, is_pdf: bool, is_docx: bool, output_path: str):\n",
" \"\"\"\n",
" Appends sanitized data to an output file.\n",
" \"\"\"\n",
" sanitized_data = sanitize_text(data)\n",
" if is_pdf or is_docx:\n",
" output_path = str(Path(output_path).with_suffix('')) + \".documents.txt\"\n",
" \n",
" with open(output_path, \"a\", encoding='utf-8') as output_file:\n",
" output_file.write(sanitized_data)\n",
"\n",
"def process_file(file):\n",
" is_html = file.endswith('.html')\n",
" is_pdf = file.endswith('.pdf')\n",
" is_docx = file.endswith('.docx')\n",
" \n",
" file_content = read_and_convert_file(file, is_html, is_pdf, is_docx)\n",
" append_to_output(file_content, is_pdf, is_docx, output_path=output_path)\n",
"\n",
"def process_files_in_directory(directory: str):\n",
" txt_html_files = glob.glob(os.path.join(directory, \"*.txt\")) + glob.glob(os.path.join(directory, \"*.html\"))\n",
" pdf_docx_files = glob.glob(os.path.join(directory, \"img\", \"*.pdf\")) + glob.glob(os.path.join(directory, \"img\", \"*.docx\"))\n",
" all_files = txt_html_files + pdf_docx_files\n",
"\n",
" # Initialize the progress bar\n",
" pbar = tqdm(total=len(all_files), desc=\"Processing files\")\n",
"\n",
" with ThreadPoolExecutor(max_workers=3) as executor:\n",
" # Submit all files to the executor and store future objects\n",
" futures = [executor.submit(process_file, file) for file in all_files]\n",
" \n",
" # As tasks complete, update the progress bar\n",
" for future in as_completed(futures):\n",
" pbar.update(1) # Update the progress bar by one for each task completed\n",
"\n",
" # Ensure the progress bar is closed upon completion\n",
" pbar.close()\n",
"\n",
"process_files_in_directory(\"/home/marius/data/it-sec-research-extracted/IT sec research\")"
]
},
{
"cell_type": "markdown",
"id": "e1bcc07f980c865f",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"## Chunking of the texts\n",
"\n",
"The texts need to get chunked (pre-processing) before the embedding process."
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "b14fb1c3219660ad",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-17T16:13:14.479469Z",
"start_time": "2024-03-17T16:13:14.476765Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"os.chdir(\"/home/marius/source/bookworm\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "de8d9f18d8342c57",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:17:53.867414Z",
"start_time": "2024-03-21T15:17:32.731232Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Now you have 723845 chunks\n"
]
}
],
"source": [
"from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
"\n",
"def chunk_text_data():\n",
" \n",
" with open('/home/marius/source/bookworm/export.txt') as f:\n",
" text_notes = f.read()\n",
" \n",
" text_splitter = RecursiveCharacterTextSplitter(\n",
" chunk_size=100,\n",
" chunk_overlap=20,\n",
" length_function=len\n",
" )\n",
" \n",
" chunks = text_splitter.create_documents([text_notes])\n",
" print(f'Now you have {len(chunks)} chunks')\n",
" return chunks\n",
" \n",
"chunks = chunk_text_data()"
]
},
{
"cell_type": "markdown",
"id": "aea7ceb111fed5f3",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"### Embedding costs - why no OpenAI?\n",
"\n",
"The OpenAI API has a cost for the embeddings.\n",
"At this point there seems to be no way to pre-estimate the costs reliably. \n",
"The following calculation is flawed:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "afb2c8feb9ca0bb4",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:18:51.003585Z",
"start_time": "2024-03-21T15:18:31.411234Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total Tokens: 15769414\n",
"Embedding Cost in USD: 473.08241999999996\n"
]
}
],
"source": [
"def print_embedding_cost(texts):\n",
" import tiktoken\n",
" enc = tiktoken.encoding_for_model('gpt-4')\n",
" total_tokens = sum([len(enc.encode(page.page_content)) for page in texts])\n",
" print(f'Total Tokens: {total_tokens}')\n",
" print(f'Embedding Cost in USD: { (0.03 / 1_000) * total_tokens}')\n",
" \n",
"print_embedding_cost(chunks)"
]
},
{
"cell_type": "markdown",
"id": "8012516604037e2f",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"## Use Hugging Face Embeddings Sentence Transformers\n",
"\n",
"* use a self-hosted on-premises model for the embedding and vectorization\n",
"* configure it for the use with the CPU\n",
"\n",
"This model is from the Beijing Academy of Artificial Intelligence\n",
"* https://huggingface.co/BAAI/bge-large-en-v1.5 \n",
"* https://huggingface.co/docs/transformers/model_doc/auto \n",
"\n",
"It will produce embeddings of 1024 dimensions, roughly 500 less than OpenAI."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "c1ca979bbc1610bb",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:19:15.167038Z",
"start_time": "2024-03-21T15:19:15.031139Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"from langchain.embeddings import HuggingFaceEmbeddings\n",
"\n",
"modelPath = \"BAAI/bge-large-en-v1.5\"\n",
"\n",
"# Create a dictionary with model configuration options, specifying to use the CPU for computations\n",
"model_kwargs = {'device':'cpu'}\n",
"\n",
"# Create a dictionary with encoding options, specifically setting 'normalize_embeddings' to False\n",
"encode_kwargs = {'normalize_embeddings': True}"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "3c2b9cd67f161714",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T15:42:28.163005Z",
"start_time": "2024-03-21T15:42:26.222594Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"# Initialize an instance of HuggingFaceEmbeddings with the specified parameters\n",
"# this model requires sentence_transformers\n",
"\n",
"embeddings = HuggingFaceEmbeddings(\n",
" model_name=modelPath, # Provide the pre-trained model's path\n",
" model_kwargs=model_kwargs, # Pass the model configuration options\n",
" encode_kwargs=encode_kwargs # Pass the encoding options\n",
" )\n"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "3b9ff8cad49442cf",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T16:18:45.930652Z",
"start_time": "2024-03-21T16:18:42.989032Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.02669697254896164, 0.017016947269439697, -0.0252668596804142, 0.027562297880649567, -0.036536093801259995, -0.04702713340520859, -0.008289276622235775, 0.027264799922704697, 0.0193538386374712, 0.09645088016986847, 0.04814787581562996, 0.020076178014278412, 0.04018039628863335, -0.05319904163479805, -0.0018393148202449083, 0.0004135535564273596, 0.0056005921214818954, -0.0007755732513032854, -0.01713593304157257, 0.046697087585926056, 0.02949507348239422, -0.002135329181328416, -0.06421148031949997, -0.0025980528444051743, -0.002175381872802973, -0.016258634626865387, 0.03560303896665573, 0.025036070495843887, 0.03057222068309784, 0.07080159336328506, -0.03819547966122627, -0.009489326737821102, 0.018622957170009613, -0.02314341999590397, -0.01928570494055748, 0.008893653750419617, 0.020412752404808998, -0.0026669444050639868, -0.04702509567141533, -0.07154359668493271, -0.00985659845173359, 0.0010672420030459762, 0.007422462571412325, -0.027616797015070915, -0.037166301161050797, -0.03903781622648239, -0.021067800000309944, 0.023234857246279716, -0.02984745241701603, -0.0003557372256182134, -0.0062873163260519505, 0.017065711319446564, 0.04882030934095383, -0.021840935572981834, 0.012029100209474564, 0.033996764570474625, -0.006590498611330986, 0.026026088744401932, -0.01962001994252205, 0.010742586106061935, 0.038518138229846954, -0.009543508291244507, 0.006120799575001001, -0.04429181292653084, 0.016838695853948593, 0.012138907797634602, -0.05647517368197441, 0.012697356753051281, -0.039533913135528564, 0.01181220356374979, -0.002553032711148262, 0.02627074159681797, -0.003673797706142068, -0.019179729744791985, -0.012743696570396423, 0.017957448959350586, -0.002778472378849983, 0.027680017054080963, -0.04603710398077965, 0.03110506199300289, -0.014483182691037655, 0.0061340732499957085, 0.023356124758720398, -0.027098359540104866, 0.025932958349585533, -0.054804012179374695, 0.021440045908093452, -0.0021313962060958147, 0.008103386498987675, -0.004042080603539944, 0.07958704978227615, 0.04686443880200386, 0.0025805693585425615, -0.024902688339352608, 0.0027323083486407995, 0.012498576194047928, -0.007472028490155935, 0.04842745512723923, -0.009689773432910442, -0.002272476674988866, 0.049017928540706635, 0.009563890285789967, -0.02213067188858986, 0.046894025057554245, -0.016963794827461243, -0.001712314086034894, -0.007016458548605442, 0.027962010353803635, -0.0058366162702441216, -0.03457598388195038, 0.026866907253861427, -0.0060468679293990135, 0.00999391358345747, 0.006039618514478207, -0.01602409966289997, 0.026533283293247223, -0.01798826828598976, 0.024779003113508224, 0.007074084132909775, -0.030575281009078026, 0.007484155241400003, 0.009421328082680702, 0.018538348376750946, -0.008937075734138489, -0.0016853661509230733, -0.037765245884656906, -0.008333210833370686, 0.029538191854953766, -0.05277511849999428, -0.008469143882393837, -0.011122306808829308, -0.013142808340489864, 0.018477508798241615, 0.029102321714162827, -0.050660859793424606, 0.020982826128602028, 0.02953541837632656, 0.009202391840517521, 0.005015721544623375, -0.014471577480435371, 0.005917319096624851, -0.02452758327126503, 0.034311287105083466, 0.06870651245117188, -0.004787039011716843, 0.03030187450349331, 0.02345900796353817, 0.00826261192560196, -0.008425573818385601, 0.019262364134192467, -0.041782982647418976, -0.01021308172494173, 0.020281389355659485, 0.05825428292155266, -0.02157139964401722, -0.004128106404095888, -0.0027353025507181883, 0.03297201544046402, -0.014398119412362576, 0.014553392305970192, 0.03983527049422264, 0.04522328823804855, -0.0227439533919096, 0.0208287313580513, -0.048643942922353745, 0.0009082997567020357, -0.006951106246560812, -0.035037606954574585, 0.01375054381787777, -0.01445818692445755, 0.029134731739759445, -0.022526120766997337, -0.008102713152766228, 0.003899186383932829, 0.041013214737176895, 0.01703835278749466, -0.0017122626304626465, -0.0034106560051441193, 0.004580703563988209, 0.04692504554986954, -0.015334389172494411, -0.04048878699541092, 0.013905854895710945, 0.04545815661549568, 0.02637609839439392, -0.024876520037651062, -0.005942529067397118, -0.035456329584121704, 0.009055763483047485, -0.003815994132310152, 0.03349251672625542, 0.042250510305166245, -0.04088624566793442, 0.036475807428359985, 0.0007867470849305391, 0.05007680505514145, -0.07930241525173187, 0.03347087278962135, 0.03613167628645897, -0.060714807361364365, 0.03500999137759209, -0.014432381838560104, -0.0076517025008797646, 0.009959816001355648, -0.0038949432782828808, -0.01840951293706894, 0.01927584409713745, 0.03663628175854683, -0.012195618823170662, 0.017108391970396042, 0.03935955464839935, 0.010515953414142132, -0.022479452192783356, 0.00810861773788929, 0.02403416484594345, -0.005666147451847792, -0.055953241884708405, 0.014511264860630035, 0.012436958961188793, 0.03502621874213219, -0.004479735158383846, 0.07306241244077682, 0.04001001641154289, 0.04705096036195755, 0.0067836446687579155, -0.004997556563466787, 0.03392943739891052, 0.0458277128636837, -0.02476787008345127, 0.043228670954704285, -0.005533190444111824, 0.02507350966334343, -0.012362728826701641, 0.038104090839624405, -0.0025492957793176174, 0.022532207891345024, 0.06112735718488693, 0.03815532103180885, -0.012957833707332611, 0.017975619062781334, -0.026928512379527092, 0.013103673234581947, -0.018832556903362274, -0.008338217623531818, 0.007081938441842794, -0.04475143924355507, -0.002573468955233693, 0.009175730869174004, -0.030792048200964928, -0.002042366424575448, -0.04541337862610817, 0.062379419803619385, 0.04580432549118996, -0.03932073339819908, -0.05788600444793701, -0.0036043403670191765, 0.025394434109330177, 0.014875992201268673, -0.08662696182727814, -0.01726602204144001, 0.04318573325872421, 0.01600872166454792, -0.044153034687042236, -0.03258882835507393, 0.010971899144351482, 0.03985709697008133, -0.02512078918516636, -0.021587109193205833, -0.04905792325735092, -0.02657529152929783, -0.033135440200567245, -0.041421979665756226, -0.04792818799614906, -0.02431047335267067, -0.01573329046368599, 0.019172240048646927, 0.03384144976735115, -0.08682779967784882, 0.016425080597400665, -0.05333607271313667, 0.0033381932880729437, 0.060447193682193756, 0.017225999385118484, 0.04338442161679268, 0.008887093514204025, -0.011700304225087166, -0.030784783884882927, 0.029799390584230423, -0.03854043781757355, 0.049850620329380035, 0.004930292721837759, -0.01851404272019863, -0.020112883299589157, -0.014539582654833794, -0.01787666045129299, 0.009195232763886452, 0.01050050463527441, 0.03788701444864273, 0.0012937176506966352, -0.02818729355931282, -0.04917585849761963, 0.007781427353620529, 0.0019566104747354984, -0.012814824469387531, -0.004947727080434561, 0.045950356870889664, 0.03646671772003174, 0.002791403094306588, 0.004697783850133419, 0.012815515510737896, -0.01621047966182232, 0.062401182949543, 0.02047150954604149, 0.05026695504784584, -0.03780040517449379, 0.0667409673333168, 0.00224861572496593, 0.010478171519935131, -0.015742754563689232, 0.001655526808463037, -0.04362569749355316, 0.0034662846010178328, -0.005219882819801569, -0.03515452519059181, -0.020455151796340942, 0.047166526317596436, -0.02139909565448761, -0.07183513790369034, 0.046170882880687714, -0.029244720935821533, -0.02688049152493477, 0.014976671896874905, 0.0026486904826015234, 0.03429925814270973, -0.005890225525945425, 0.04202268272638321, -0.018020452931523323, -0.026976708322763443, -0.019771136343479156, -0.01675950177013874, -0.014742839150130749, -0.015525337308645248, -0.0006239615031518042, 0.009381762705743313, -0.008762863464653492, -0.03805861622095108, 0.012787258252501488, -0.015712112188339233, -0.003921184688806534, -0.005539625883102417, -0.005669189151376486, 0.00488162599503994, -0.006071238778531551, -0.03561935946345329, 0.019709182903170586, 0.08087684214115143, -0.06412699073553085, -0.0018153585260733962, -0.010365016758441925, -0.04116988182067871, 0.010356743820011616, 0.0435556024312973, 0.030156446620821953, -0.030642440542578697, -0.012417435646057129, -0.033950094133615494, 0.002666833810508251, 0.01121507491916418, 0.04220520704984665, -0.03539181128144264, 0.03651658818125725, 0.00986762810498476, -0.03320850059390068, 0.021042536944150925, 0.012748521752655506, -0.020613038912415504, 0.01267313864082098, 0.0024715387262403965, 0.0433194562792778, -0.03464338928461075, -0.0238817036151886, -0.0015052399830892682, -0.00813769269734621, 0.04605727642774582, -0.027353445068001747, 0.06496832519769669, -0.03492479398846626, -0.045068010687828064, -0.03321715444326401, -0.015229083597660065, -0.008961583487689495, -0.0526081845164299, 0.005047208163887262, -0.030239446088671684, -0.04611031711101532, -0.039567962288856506, 0.07561783492565155, 0.036560021340847015, 0.01159034762531519, 0.0036433383356779814, 0.024782907217741013, 0.005812737625092268, 0.04545712098479271, 0.027075251564383507, 0.01286619994789362, 0.024930741637945175, -0.0288272462785244, 0.05911048501729965, 0.07540696859359741, 0.010551726445555687, -0.006818344816565514, 0.02673436515033245, -0.019977428019046783, -0.008833578787744045, -0.033249977976083755, -0.016189124435186386, -0.014444072730839252, 0.01637876033782959, -0.005723794922232628, 0.023274188861250877, -0.032903142273426056, -0.045395225286483765, -0.017752068117260933, 0.0721108615398407, 0.049269575625658035, -0.03940099477767944, 0.007023515645414591, -0.0543445460498333, 0.0143172862008214, 0.03877531737089157, 0.026651587337255478, 0.03261725232005119, -0.02641334943473339, -0.03475888818502426, -0.06196092814207077, -0.007730958051979542, 0.02938351035118103, 0.04688352346420288, 0.001492986804805696, -0.052002474665641785, 0.011494527570903301, -0.0059143840335309505, -0.009254072792828083, 0.04071874916553497, -0.01937096193432808, -0.01605319045484066, 0.021356504410505295, 0.010376271791756153, 0.058524928987026215, 0.0370134562253952, 0.03336495906114578, -0.048666149377822876, 0.015760764479637146, -0.02909715287387371, 0.001060734037309885, 0.012889999896287918, 0.032121844589710236, 0.013724256306886673, 0.031370609998703, 0.007055149879306555, -0.02331012301146984, 0.020068591460585594, 0.02982570417225361, -0.01615154929459095, 0.012022043578326702, 0.019594961777329445, 0.004770875908434391, 0.002515221945941448, -0.014973344281315804, 0.03073306567966938, 0.03203507512807846, -0.0029318509623408318, 0.009544199332594872, -0.050643883645534515, 0.002601445419713855, -0.0004585186834447086, 0.0448162779211998, -0.01774679683148861, -0.016735566779971123, -0.02339322306215763, -0.026880457997322083, 0.05137190222740173, 0.029895957559347153, 0.00011596392141655087, 0.011301418766379356, -0.02502586506307125, 0.00284388056024909, 0.0031197925563901663, 0.00524180056527257, 0.0222946610301733, 0.0036125867627561092, -0.012878148816525936, -0.00956246443092823, -0.027970684692263603, -0.011681201867759228, 0.024373246356844902, -0.005530762951821089, -0.05088534951210022, 0.05565162003040314, 0.018190396949648857, 0.018322333693504333, -0.0008641738095320761, -0.016653986647725105, -0.00699530728161335, -0.03933033347129822, -0.003116237698122859, -0.04750656336545944, -0.0035764453932642937, -0.022624090313911438, -0.0008451906032860279, -0.0022958663757890463, 0.05381815508008003, -0.023221293464303017, 0.014970600605010986, 0.0403008870780468, 0.0064455182291567326, 0.06484071165323257, -0.019952522590756416, -0.037979792803525925, 0.061297088861465454, 0.05363653600215912, -0.04460182040929794, -0.010982992127537727, 0.002395677613094449, 0.018435178324580193, 0.02920987270772457, -0.011680102907121181, -0.08589381724596024, -0.029022831469774246, -0.03032723255455494, 0.033892858773469925, -0.03672119975090027, -0.022506827488541603, -0.013491013087332249, -0.016303280368447304, -0.01263154111802578, 0.0426502525806427, -0.008024784736335278, -0.07593175023794174, -0.0127875292673707, -0.02627779170870781, 0.021790960803627968, 0.022001486271619797, 0.04400036484003067, -0.016813144087791443, -0.017746321856975555, 0.014189604669809341, 0.0027446087915450335, -0.03549749404191971, 0.02558237686753273, 0.00542211439460516, 0.019051723182201385, 0.004861325956881046, 0.03930363059043884, -0.04968566447496414, -0.049693383276462555, 0.026898667216300964, 0.009030058979988098, -0.05464783310890198, -0.0030248991679400206, -0.007074778899550438, 0.027226950973272324, -0.045234616845846176, 0.006987966597080231, -0.024752477183938026, -0.02165602706372738, -0.04195421561598778, 0.01698700711131096, 0.009086058475077152, -0.04968562722206116, -0.014020346105098724, 0.019671428948640823, -0.019008539617061615, 0.004943450912833214, 0.03402810916304588, -0.01245468482375145, -0.023897185921669006, -0.04492456093430519, -0.0672251284122467, 0.02267123945057392, 0.020500896498560905, -0.007905700244009495, -0.05864157900214195, -0.017291076481342316, -0.022529250010848045, -0.07144097238779068, 0.03627387434244156, 0.05300053581595421, -0.01996050402522087, 0.026578404009342194, -0.027966128662228584, 0.017535410821437836, 0.003619209863245487, -0.009975985623896122, 0.016709165647625923, 0.006767536047846079, -0.012295933440327644, -0.03252935782074928, -0.0308682881295681, -0.008659521117806435, -0.004427710548043251, -0.016697656363248825, 0.0846182107925415, -0.071721650660038, 0.03372944891452789, 0.010209917090833187, -0.034838251769542694, 0.0033220346085727215, 0.014964933507144451, 0.0036047310568392277, 0.030168497934937477, 0.0021488042548298836, 0.0211726613342762, -0.0097010787576437, -0.019522184506058693, -0.00899591390043497, -0.0331675224006176, -0.04197953641414642, 0.05111600086092949, -0.006391274277120829, -0.012627888470888138, 0.06245993822813034, 0.027174271643161774, -0.00580727681517601, -0.05560539290308952, 0.03141642361879349, 0.009324997663497925, -0.003272688016295433, -0.047126710414886475, 0.024162929505109787, -0.009179646149277687, -0.04455089196562767, 0.0017887114081531763, 0.0033528197091072798, 0.02224148064851761, 0.0030729654245078564, 0.017404256388545036, 0.029646797105669975, -0.005246543325483799, 0.002203059382736683, 0.060110725462436676, 0.028904344886541367, -0.03258912265300751, -0.09100892394781113, -0.018463512882590294, -0.02261725813150406, 0.039159584790468216, 0.05506680905818939, 0.011777144856750965, -0.011479132808744907, 0.01948135904967785, -0.018709277734160423, 0.062444720417261124, -0.028424400836229324, -0.009348088875412941, 0.060308896005153656, -0.04960506036877632, -0.052798304706811905, 0.030832994729280472, -0.023405568674206734, -0.012619088403880596, 0.019418999552726746, -0.04199061542749405, 0.012573529966175556, -0.008077583275735378, 0.03233648091554642, -0.06048568710684776, -0.037223659455776215, -0.006776227615773678, -0.0765281617641449, -0.02046184055507183, -0.028335049748420715, -0.03072420135140419, -0.015347683802247047, 0.00011257602454861626, -0.006173537578433752, -0.06329714506864548, -0.038208477199077606, 0.007293719798326492, 0.016451958566904068, -0.009434198029339314, -0.036277417093515396, 0.031770799309015274, -0.05689932778477669, 0.0050352588295936584, 0.017117278650403023, 0.023538224399089813, -0.017084859311580658, -0.029851967468857765, 0.0034172760788351297, -0.022277364507317543, 0.01787102408707142, 0.044267136603593826, -0.016108497977256775, 0.0018049232894554734, -0.06561078876256943, -0.008170049637556076, 0.020584596320986748, -0.03578933700919151, -0.008622702211141586, 0.0041429148986935616, 0.01321740634739399, 0.005637933500111103, 0.027713214978575706, -0.03736696019768715, -0.012070078402757645, -0.024344071745872498, 0.0038054941687732935, 0.04483693093061447, -0.00929549615830183, -0.06807441264390945, -0.014590064994990826, -0.0012703625252470374, -0.05199921503663063, -0.021045329049229622, 0.0017236988060176373, 0.020581327378749847, 0.00310335261747241, 0.014803273603320122, 0.007082259748131037, 0.018589694052934647, -0.020445356145501137, 0.005138273350894451, 0.04842124134302139, 0.01742020808160305, 0.030288565903902054, -0.0038397167809307575, 0.035734400153160095, 0.005221309140324593, 0.009709448553621769, 0.0009714406332932413, -0.003338858485221863, -0.009880861267447472, -0.0354900136590004, 0.04243701323866844, -0.02065272442996502, -0.033083800226449966, -0.01976737193763256, 0.03881418704986572, -0.015840662643313408, -0.014110976830124855, 0.02787899598479271, 0.015958787873387337, -0.024252016097307205, 0.018708642572164536, -0.05208557844161987, 0.009075745940208435, -0.06176981329917908, 0.0020644953474402428, -0.02534164860844612, -0.009223466739058495, -0.013906687498092651, -0.006282609421759844, -0.033772144466638565, -0.004664893262088299, -0.03690044581890106, 0.014286994934082031, -0.013754536397755146, -0.02677650935947895, -0.004116437863558531, 0.03696655482053757, -0.05480392277240753, 0.0025101948995143175, -0.02389528602361679, -0.002059308346360922, -0.00986967608332634, -0.06474544107913971, 0.002008399460464716, 0.04639190435409546, 0.02575313299894333, -0.03954186290502548, -0.04276818782091141, -0.0003671206359285861, 0.038086578249931335, 0.08546829968690872, 0.002681935206055641, 0.005467512179166079, -0.07309430092573166, 0.03508995473384857, -0.011109807528555393, 0.04884098097681999, -0.015379451215267181, 0.021916523575782776, 0.006058952771127224, 0.025333305820822716, -0.03931069001555443, 0.011501088738441467, 0.08444537222385406, -0.019699491560459137, 0.03001621551811695, 0.04052627459168434, 0.01509734708815813, -0.0036059776321053505, 0.0024216563906520605, -0.03624400123953819, 0.06096984073519707, 0.026573486626148224, 0.028464647009968758, 0.005288115702569485, 0.013628870248794556, 0.03701353818178177, -0.04464303329586983, -0.020769106224179268, 0.0007852627313695848, 0.0073068286292254925, -0.04131774231791496, -0.017183959484100342, 0.00045813480392098427, 0.04228818416595459, 0.00895351730287075, 0.0029041890520602465, 0.0013040080666542053, -0.028432169929146767, -0.03928574174642563, 0.0279998779296875, -0.01892475038766861, 0.03696105256676674, -0.04983842000365257, 0.022238286212086678, -0.00751550542190671, -0.06007396802306175, 0.059541404247283936, 0.03675074875354767, -0.05834772065281868, -0.015122296288609505, 0.02690679021179676, 0.043969638645648956, 0.03015589341521263, 0.01313701830804348, 0.02406138740479946, 0.021920770406723022, -0.045081283897161484, 0.01872667483985424, -0.016369646415114403, 0.03949194774031639, -0.01271951012313366, 0.009316700510680676, -0.06436794996261597, 0.039648935198783875, -0.0453445203602314, -0.015228724107146263, 0.022167755290865898, -0.026275550946593285, -0.015110056847333908, -0.03270441293716431, 0.04136410355567932, 0.014791132882237434, 0.016533788293600082, 0.04523699730634689, 0.005338069051504135, 0.012556244619190693, -0.011820793151855469, -0.02688733860850334, -0.013957234099507332, 0.027324875816702843, 0.0016771637601777911, -0.01908678561449051, 0.0879625678062439, -0.017585109919309616, 0.001506523578427732, 0.014244329184293747, -0.016734294593334198, -0.04028971865773201, -0.011828437447547913, 0.044278573244810104, -0.04623398929834366, -0.015288792550563812, 0.018561312928795815, -0.05677640065550804, 0.03038403019309044, 0.01473618857562542, 0.004557834006845951, -0.010420982725918293, 0.01662040688097477, -0.021740473806858063, -0.02423125132918358, 0.0002266458614030853, 0.03118511661887169, 0.03346552327275276, -0.02155519463121891, -0.046199776232242584, -0.009229421615600586, -0.02052953839302063, -0.030543895438313484, -0.044173769652843475, -0.0064188409596681595, -0.019747091457247734, -0.002618914470076561, -0.03886003792285919, -0.0005130494828335941, -0.03990660607814789, -0.05446924641728401, 0.0008680057944729924, -0.022065455093979836, 0.000695459486451, 0.024503331631422043, 0.02740980125963688, 0.0306197889149189, -0.02932315692305565, 0.035693682730197906, 0.025483516976237297, 0.04890481382608414, -0.023647328838706017, 0.05986616015434265, 0.04637400060892105, 0.015953946858644485, 0.001707101590000093, -0.020600399002432823, 0.013272842392325401, -0.019768258556723595, 0.0003686780692078173, -0.02926027588546276, 0.008464827202260494, -0.055541615933179855, -0.008259587921202183, 0.027637088671326637, 0.04876914620399475, -0.008188378997147083, -0.049882255494594574, -0.0046189576387405396, -0.034740377217531204, -0.06877958029508591, -0.033453308045864105, -0.057299237698316574, 0.04424375668168068, 0.009012886323034763, -0.006461849436163902, 0.004532593302428722, -0.06137078255414963, 0.17926841974258423, 0.04031744226813316, 0.020939242094755173, 0.01988190971314907, 0.0009072233224287629, -0.005762910004705191, 0.03745949640870094, -0.019865624606609344, -0.008318456821143627, -0.04051871597766876, 0.029783369973301888, 0.004821800626814365, 0.007900829426944256, 0.032089006155729294, 0.021734507754445076, 0.01714659295976162, -0.01962159015238285, -0.020563235506415367, 0.03429047018289566, -0.017661085352301598, -0.040097665041685104, 0.00648909155279398, -0.009551159106194973, 0.02434762567281723, 0.012318463996052742, 0.014526142738759518, 0.011561332270503044, -0.03873499855399132, -0.03418339416384697, -0.0007731473306193948, 0.003652141662314534, 0.009530676528811455, 0.027439458295702934, -0.007102441508322954, -0.0400245375931263, 0.03153190389275551, 0.014316375367343426, -0.025393975898623466, 0.01789182424545288, 0.016893461346626282, -0.009018915705382824, -0.008043519221246243, -0.021284257993102074, 0.002061843406409025, -0.0010233575012534857, 0.06653787940740585, 0.008115660399198532, 0.010903468355536461, 0.0010773276444524527, -0.0525977797806263, -0.0018644867232069373, -0.044708263128995895, 0.011509076692163944, -0.0441756471991539, 0.004411631729453802, -0.003872891655191779, 0.02756294049322605, 0.016089696437120438, 0.024755354970693588, -0.01461919117718935, 0.010851399973034859, 0.01563720591366291, -0.026414982974529266, 0.03514556959271431, -0.036658551543951035, -0.008005528710782528, -0.019284449517726898, 0.049641821533441544, 0.005416483618319035, 0.004511935170739889, -0.008117018267512321, -0.023252980783581734, -0.018745051696896553, 0.00846992526203394, 0.012148547917604446, -0.006063555832952261, -0.00444689579308033, -0.019263027235865593, 0.011437769047915936, -0.00979433674365282, -0.019153140485286713, -0.0344361774623394, -0.060506489127874374, -0.03711846098303795, 0.02680795267224312, 0.028888490051031113, 0.004586066119372845, 0.03112998977303505, 0.011415940709412098, 0.0645357221364975, 0.03468457981944084, 0.037274934351444244, -0.019164782017469406, -0.04222643002867699, -0.015291324816644192]\n",
"1024\n"
]
}
],
"source": [
"vector = embeddings.embed_query(chunks[0].page_content)\n",
"print(vector)\n",
"print(len(vector))"
]
},
{
"cell_type": "markdown",
"id": "b347fb5ee68daf60",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"source": [
"## Batch process the embedding\n",
"\n",
"Many data-science tasks require to split a larger processing operation into batch jobs.\n",
"Like in the good old Mainframe days.\n",
"\n",
"The vector DB: https://github.com/asg017/sqlite-vss \n",
"Basis: https://faiss.ai/ - a library for efficient similarity search and clustering of dense vectors.\n",
"\n",
"We add vectors of 1024 dimensions per chunk (sentence, line break delimited) to the DB.\n",
"The processing is done in batches of 50 chunks, using 3 threads."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "b03bfcb6c666db1",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T16:04:44.572979Z",
"start_time": "2024-03-21T16:04:43.521107Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"# we can use concurrent processing to speed up the embedding process\n",
"from concurrent.futures import ThreadPoolExecutor, as_completed\n",
"\n",
"from langchain_community.vectorstores import SQLiteVSS\n",
"import os\n",
"from tqdm.notebook import tqdm # Import tqdm for notebook\n",
"from typing import List\n",
"from langchain.schema.document import Document"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "e6ffc345c26298ad",
"metadata": {
"ExecuteTime": {
"end_time": "2024-03-21T16:10:22.121211Z",
"start_time": "2024-03-21T16:08:20.585372Z"
},
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d2afb7310af44a3c85a3b59e58be64e1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Processing batches: 0%| | 0/14477 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[38], line 44\u001b[0m, in \u001b[0;36mvectorize_data_in_batches\u001b[0;34m(chunks, embeddings)\u001b[0m\n\u001b[1;32m 42\u001b[0m progress_bar \u001b[38;5;241m=\u001b[39m tqdm(total\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mlen\u001b[39m(futures), desc\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mProcessing batches\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 44\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mfuture\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mas_completed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 45\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Each time a future completes, update the progress\u001b[39;49;00m\n\u001b[1;32m 46\u001b[0m \u001b[43m \u001b[49m\u001b[43mprogress_bar\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mupdate\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/_base.py:243\u001b[0m, in \u001b[0;36mas_completed\u001b[0;34m(fs, timeout)\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTimeoutError\u001b[39;00m(\n\u001b[1;32m 240\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m (of \u001b[39m\u001b[38;5;132;01m%d\u001b[39;00m\u001b[38;5;124m) futures unfinished\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (\n\u001b[1;32m 241\u001b[0m \u001b[38;5;28mlen\u001b[39m(pending), total_futures))\n\u001b[0;32m--> 243\u001b[0m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mevent\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait_timeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 245\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m waiter\u001b[38;5;241m.\u001b[39mlock:\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:629\u001b[0m, in \u001b[0;36mEvent.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 628\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m signaled:\n\u001b[0;32m--> 629\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cond\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m signaled\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:327\u001b[0m, in \u001b[0;36mCondition.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 327\u001b[0m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 328\u001b[0m gotit \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: ",
"\nDuring handling of the above exception, another exception occurred:\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[38], line 52\u001b[0m\n\u001b[1;32m 48\u001b[0m progress_bar\u001b[38;5;241m.\u001b[39mclose() \u001b[38;5;66;03m# Ensure the progress bar is closed at the end\u001b[39;00m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAll texts have been added to the database.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m---> 52\u001b[0m \u001b[43mvectorize_data_in_batches\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mchunks\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43membeddings\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43membeddings\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 53\u001b[0m \u001b[38;5;66;03m# todo : documents go to different table. \u001b[39;00m\n\u001b[1;32m 54\u001b[0m \u001b[38;5;66;03m# todo: similarity queries\u001b[39;00m\n",
"Cell \u001b[0;32mIn[38], line 37\u001b[0m, in \u001b[0;36mvectorize_data_in_batches\u001b[0;34m(chunks, embeddings)\u001b[0m\n\u001b[1;32m 33\u001b[0m batch_size \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m50\u001b[39m \u001b[38;5;66;03m# Adjust based on your needs and memory constraints\u001b[39;00m\n\u001b[1;32m 35\u001b[0m batches \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(divide_chunks(chunks, batch_size))\n\u001b[0;32m---> 37\u001b[0m \u001b[43m\u001b[49m\u001b[38;5;28;43;01mwith\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mThreadPoolExecutor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmax_workers\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnum_workers\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mas\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mexecutor\u001b[49m\u001b[43m:\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Wrap the 'submit' calls with 'tqdm' for immediate feedback\u001b[39;49;00m\n\u001b[1;32m 39\u001b[0m \u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[43mexecutor\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msubmit\u001b[49m\u001b[43m(\u001b[49m\u001b[43madd_texts_in_batches\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbatch\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mbatch\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mbatches\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 41\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Setup the tqdm progress bar\u001b[39;49;00m\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/_base.py:647\u001b[0m, in \u001b[0;36mExecutor.__exit__\u001b[0;34m(self, exc_type, exc_val, exc_tb)\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, exc_type, exc_val, exc_tb):\n\u001b[0;32m--> 647\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mshutdown\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 648\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/concurrent/futures/thread.py:235\u001b[0m, in \u001b[0;36mThreadPoolExecutor.shutdown\u001b[0;34m(self, wait, cancel_futures)\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait:\n\u001b[1;32m 234\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads:\n\u001b[0;32m--> 235\u001b[0m \u001b[43mt\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:1119\u001b[0m, in \u001b[0;36mThread.join\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1116\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot join current thread\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1118\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1119\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_wait_for_tstate_lock\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1120\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1121\u001b[0m \u001b[38;5;66;03m# the behavior of a negative timeout isn't documented, but\u001b[39;00m\n\u001b[1;32m 1122\u001b[0m \u001b[38;5;66;03m# historically .join(timeout=x) for x<0 has acted as if timeout=0\u001b[39;00m\n\u001b[1;32m 1123\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wait_for_tstate_lock(timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mmax\u001b[39m(timeout, \u001b[38;5;241m0\u001b[39m))\n",
"File \u001b[0;32m~/miniconda3/envs/llm_langchain/lib/python3.11/threading.py:1139\u001b[0m, in \u001b[0;36mThread._wait_for_tstate_lock\u001b[0;34m(self, block, timeout)\u001b[0m\n\u001b[1;32m 1136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 1138\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 1139\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mlock\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[1;32m 1140\u001b[0m lock\u001b[38;5;241m.\u001b[39mrelease()\n\u001b[1;32m 1141\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_stop()\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"def add_texts_in_batches(batch: List[Document], sqlite_table: str = \"evernote\", embeddings=embeddings) -> None:\n",
" \"\"\"\n",
" Using type hints is a good idea here, because error messages get swallowed by the ThreadPoolExecutor.\n",
" \n",
" The exception handling serves the same purpose. \n",
" \n",
" Create a new connection to the database within each thread,\n",
" then add a batch of texts. This ensures that the SQLite connection\n",
" is used in the thread where it was created.\n",
" \n",
" This needs sqlite-vss . \n",
" \"\"\"\n",
" try:\n",
" # Create a new connection for each batch\n",
" # sqlite isn't thread-safe afaik\n",
" \n",
" connection = SQLiteVSS.create_connection(db_file=\"/home/marius/source/bookworm/evernote.db\")\n",
"\n",
" local_db = SQLiteVSS(\n",
" table=sqlite_table,\n",
" embedding=embeddings,\n",
" connection=connection\n",
" )\n",
" local_db.add_documents(batch)\n",
" # sqlite here doesn't get closed.\n",
"\n",
" except Exception as e:\n",
" print(f\"Exception occurred in add_texts_in_batches: {e}\")\n",
"\n",
"def divide_chunks(chunks, n):\n",
" \"\"\"\n",
" Divide and conquer\n",
" \"\"\"\n",
" for i in range(0, len(chunks), n):\n",
" yield chunks[i:i + n]\n",
"\n",
"def vectorize_data_in_batches(chunks, embeddings):\n",
" num_workers = 3\n",
" batch_size = 50 # Adjust based on your needs and memory constraints\n",
"\n",
" batches = list(divide_chunks(chunks, batch_size))\n",
"\n",
" with ThreadPoolExecutor(max_workers=num_workers) as executor:\n",
" # Wrap the 'submit' calls with 'tqdm' for immediate feedback\n",
" futures = [executor.submit(add_texts_in_batches, batch) for batch in batches]\n",
" \n",
" # Setup the tqdm progress bar\n",
" progress_bar = tqdm(total=len(futures), desc=\"Processing batches\")\n",
" \n",
" for future in as_completed(futures):\n",
" # Each time a future completes, update the progress\n",
" progress_bar.update(1)\n",
" \n",
" progress_bar.close() # Ensure the progress bar is closed at the end\n",
"\n",
" print(\"All texts have been added to the database.\")\n",
" \n",
"vectorize_data_in_batches(chunks=chunks, embeddings=embeddings)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5f01a969c4aedac8",
"metadata": {
"collapsed": false,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [],
"source": [
"# todo : documents go to different table. \n",
"# todo: similarity queries"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}