diff --git a/polars/polars-arrow/Cargo.toml b/polars/polars-arrow/Cargo.toml index b36e89561eb6..6339cc9d290d 100644 --- a/polars/polars-arrow/Cargo.toml +++ b/polars/polars-arrow/Cargo.toml @@ -9,8 +9,8 @@ description = "Arrow interfaces for Polars DataFrame library" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -# arrow = { package = "arrow2", git = "https://github.com/jorgecarleitao/arrow2", rev = "b46a636f31d70a20bd54df9c7f9e9363053ade08", default-features = false } -arrow = { package = "arrow2", git = "https://github.com/ritchie46/arrow2", branch = "cherry_pick", default-features = false } +arrow = { package = "arrow2", git = "https://github.com/jorgecarleitao/arrow2", rev = "0175d9e3c54f6c3c81e3a6db3f1c39b4ba3b93fe", default-features = false } +# arrow = { package = "arrow2", git = "https://github.com/ritchie46/arrow2", branch = "cherry_pick", default-features = false } # arrow = { package = "arrow2", version = "0.9", default-features = false, features = ["compute_concatenate"] } hashbrown = "0.12" num = "^0.4" diff --git a/polars/polars-core/Cargo.toml b/polars/polars-core/Cargo.toml index 9156f46d2d37..ecc7a04919aa 100644 --- a/polars/polars-core/Cargo.toml +++ b/polars/polars-core/Cargo.toml @@ -160,10 +160,10 @@ unsafe_unwrap = "^0.1.0" [dependencies.arrow] package = "arrow2" -# git = "https://github.com/jorgecarleitao/arrow2" -git = "https://github.com/ritchie46/arrow2" -# rev = "b46a636f31d70a20bd54df9c7f9e9363053ade08" -branch = "cherry_pick" +git = "https://github.com/jorgecarleitao/arrow2" +# git = "https://github.com/ritchie46/arrow2" +rev = "0175d9e3c54f6c3c81e3a6db3f1c39b4ba3b93fe" +# branch = "cherry_pick" # version = "0.9" default-features = false features = [ diff --git a/polars/polars-io/Cargo.toml b/polars/polars-io/Cargo.toml index baeaae573e33..0a89bb188dd0 100644 --- a/polars/polars-io/Cargo.toml +++ b/polars/polars-io/Cargo.toml @@ -16,7 +16,7 @@ json = ["arrow/io_json"] ipc = ["arrow/io_ipc", "arrow/io_ipc_compression"] # ipc = [] lazy = [] -parquet = ["polars-core/parquet", "arrow/io_parquet", "arrow/io_parquet_compression", "polars-utils"] +parquet = ["polars-core/parquet", "arrow/io_parquet", "arrow/io_parquet_compression", "polars-utils", "memmap"] dtype-datetime = ["polars-core/dtype-datetime", "polars-core/temporal"] dtype-date = ["polars-core/dtype-date"] dtype-time = ["polars-core/dtype-time", "polars-core/temporal"] @@ -31,8 +31,8 @@ private = [] [dependencies] ahash = "0.7" anyhow = "1.0" -# arrow = { package = "arrow2", git = "https://github.com/jorgecarleitao/arrow2", rev = "b46a636f31d70a20bd54df9c7f9e9363053ade08", default-features = false } -arrow = { package = "arrow2", git = "https://github.com/ritchie46/arrow2", branch = "cherry_pick", default-features = false } +arrow = { package = "arrow2", git = "https://github.com/jorgecarleitao/arrow2", rev = "0175d9e3c54f6c3c81e3a6db3f1c39b4ba3b93fe", default-features = false } +# arrow = { package = "arrow2", git = "https://github.com/ritchie46/arrow2", branch = "cherry_pick", default-features = false } # arrow = { package = "arrow2", version = "0.9", default-features = false } csv-core = { version = "0.1.10", optional = true } dirs = "4.0" diff --git a/polars/polars-io/src/parquet/predicates.rs b/polars/polars-io/src/parquet/predicates.rs index 0c0faa541c8c..a953b8795928 100644 --- a/polars/polars-io/src/parquet/predicates.rs +++ b/polars/polars-io/src/parquet/predicates.rs @@ -107,11 +107,8 @@ pub(crate) fn collect_statistics( let mut fields = vec![]; let mut stats = vec![]; - for (column_chunk_md, fld) in md.iter().zip(&schema.fields) { - if let Some(parquet_stats) = column_chunk_md.statistics() { - let parquet_stats = parquet_stats?; - let st = deserialize_statistics(&*parquet_stats)?; - + for fld in &schema.fields { + for st in deserialize_statistics(fld, md)?.into_iter().flatten() { fields.push(fld.into()); stats.push(ColumnStats(st)); } diff --git a/polars/polars-io/src/parquet/read.rs b/polars/polars-io/src/parquet/read.rs index c7b84ecee5e2..ace54df599f4 100644 --- a/polars/polars-io/src/parquet/read.rs +++ b/polars/polars-io/src/parquet/read.rs @@ -1,11 +1,9 @@ -use super::{ArrowReader, ArrowResult}; use crate::aggregations::ScanAggregation; use crate::mmap::MmapBytesReader; -use crate::parquet::read_impl::{parallel_read, read_parquet}; +use crate::parquet::read_impl::read_parquet; use crate::predicates::PhysicalIoExpr; use crate::prelude::*; use arrow::io::parquet::read; -use polars_core::frame::ArrowChunk; use polars_core::prelude::*; use std::io::{Read, Seek}; use std::sync::Arc; @@ -32,15 +30,10 @@ impl ParquetReader { ) -> Result { // this path takes predicates and parallelism into account let metadata = read::read_metadata(&mut self.reader)?; - let schema = read::schema::get_schema(&metadata)?; - - let f = match self.parallel { - true => parallel_read, - false => read_parquet, - }; + let schema = read::schema::infer_schema(&metadata)?; let rechunk = self.rechunk; - f( + read_parquet( self.reader, self.n_rows.unwrap_or(usize::MAX), projection, @@ -48,6 +41,7 @@ impl ParquetReader { Some(metadata), predicate, aggregate, + self.parallel, ) .map(|mut df| { if rechunk { @@ -86,17 +80,11 @@ impl ParquetReader { pub fn schema(mut self) -> Result { let metadata = read::read_metadata(&mut self.reader)?; - let schema = read::get_schema(&metadata)?; + let schema = read::infer_schema(&metadata)?; Ok(schema.into()) } } -impl ArrowReader for read::RecordReader { - fn next_record_batch(&mut self) -> ArrowResult> { - self.next().map_or(Ok(None), |v| v.map(Some)) - } -} - impl SerReader for ParquetReader { fn new(reader: R) -> Self { ParquetReader { @@ -116,7 +104,7 @@ impl SerReader for ParquetReader { fn finish(mut self) -> Result { let metadata = read::read_metadata(&mut self.reader)?; - let schema = read::schema::get_schema(&metadata)?; + let schema = read::schema::infer_schema(&metadata)?; if let Some(cols) = self.columns { let mut prj = Vec::with_capacity(cols.len()); @@ -128,26 +116,7 @@ impl SerReader for ParquetReader { self.projection = Some(prj); } - if self.parallel { - let rechunk = self.rechunk; - return parallel_read( - self.reader, - self.n_rows.unwrap_or(usize::MAX), - self.projection.as_deref(), - &schema, - Some(metadata), - None, - None, - ) - .map(|mut df| { - if rechunk { - df.rechunk(); - }; - df - }); - } - - let mut df = read_parquet( + read_parquet( self.reader, self.n_rows.unwrap_or(usize::MAX), self.projection.as_deref(), @@ -155,11 +124,13 @@ impl SerReader for ParquetReader { Some(metadata), None, None, - )?; - if self.rechunk { - df.rechunk(); - } - - Ok(df) + self.parallel, + ) + .map(|mut df| { + if self.rechunk { + df.rechunk(); + } + df + }) } } diff --git a/polars/polars-io/src/parquet/read_impl.rs b/polars/polars-io/src/parquet/read_impl.rs index e0cf56d1c5da..d8a5e5e38898 100644 --- a/polars/polars-io/src/parquet/read_impl.rs +++ b/polars/polars-io/src/parquet/read_impl.rs @@ -3,13 +3,11 @@ use crate::mmap::{MmapBytesReader, ReaderBytes}; use crate::parquet::predicates::collect_statistics; use crate::predicates::{apply_predicate, arrow_schema_to_empty_df, PhysicalIoExpr}; use crate::utils::apply_projection; -use arrow::array::ArrayRef; use arrow::io::parquet::read; -use arrow::io::parquet::read::{FileMetaData, MutStreamingIterator}; +use arrow::io::parquet::read::{to_deserializer, FileMetaData}; use polars_core::prelude::*; use polars_core::utils::accumulate_dataframes_vertical; use polars_core::POOL; -use polars_utils::contention_pool::LowContentionPool; use rayon::prelude::*; use std::borrow::Cow; use std::convert::TryFrom; @@ -17,6 +15,7 @@ use std::io::Cursor; use std::ops::Deref; use std::sync::Arc; +#[allow(clippy::too_many_arguments)] pub fn read_parquet( reader: R, limit: usize, @@ -25,6 +24,7 @@ pub fn read_parquet( metadata: Option, predicate: Option>, aggregate: Option<&[ScanAggregation]>, + parallel: bool, ) -> Result { let reader = ReaderBytes::from(&reader); let bytes = reader.deref(); @@ -41,9 +41,6 @@ pub fn read_parquet( let mut dfs = Vec::with_capacity(row_group_len); - let mut buf_1 = Vec::with_capacity(1024); - let mut buf_2 = Vec::with_capacity(1024); - let mut remaining_rows = limit; for rg in 0..row_group_len { @@ -61,38 +58,46 @@ pub fn read_parquet( } } } + // test we don't read the parquet file if this env var is set #[cfg(debug_assertions)] { assert!(std::env::var("POLARS_PANIC_IF_PARQUET_PARSED").is_err()) } - let columns = projection - .clone() - .iter() - .map(|column_i| { - let b1 = std::mem::take(&mut buf_1); - let b2 = std::mem::take(&mut buf_2); - - // the get_column_iterator is an iterator of columns, each column contains compressed pages. - // get_column_iterator yields `Vec>`: - // outer `Vec` is len 1 for primitive types, - // inner `Vec` is whatever number of pages the chunk contains. - let column_iter = - read::get_column_iterator(&mut reader, &file_metadata, rg, *column_i, None, b1); - let fld = &schema.fields[*column_i]; - let (mut array, b1, b2) = read::column_iter_to_array(column_iter, fld, b2)?; - - if array.len() > remaining_rows { - array = array.slice(0, remaining_rows); - } - - buf_1 = b1; - buf_2 = b2; + let chunk_size = md.num_rows() as usize; + let columns = if parallel { + POOL.install(|| { + projection + .par_iter() + .map(|column_i| { + let mut reader = Cursor::new(bytes); + let field = &schema.fields[*column_i]; + let columns = read::read_columns(&mut reader, md.columns(), &field.name)?; + let mut iter = to_deserializer( + columns, + field.clone(), + remaining_rows, + Some(chunk_size), + )?; + + Series::try_from((field.name.as_str(), iter.next().unwrap()?)) + }) + .collect::>>() + })? + } else { + projection + .iter() + .map(|column_i| { + let field = &schema.fields[*column_i]; + let columns = read::read_columns(&mut reader, md.columns(), &field.name)?; + let mut iter = + to_deserializer(columns, field.clone(), remaining_rows, Some(chunk_size))?; - Series::try_from((fld.name.as_str(), Arc::from(array))) - }) - .collect::>>()?; + Series::try_from((field.name.as_str(), iter.next().unwrap()?)) + }) + .collect::>>()? + }; remaining_rows = file_metadata.row_groups[rg].num_rows() as usize; @@ -117,130 +122,3 @@ pub fn read_parquet( Ok(df.slice(0, limit)) } } - -pub(crate) fn parallel_read( - reader: R, - limit: usize, - projection: Option<&[usize]>, - arrow_schema: &ArrowSchema, - metadata: Option, - predicate: Option>, - aggregate: Option<&[ScanAggregation]>, -) -> Result { - let reader = ReaderBytes::from(&reader); - let bytes = reader.deref(); - let mut reader = Cursor::new(bytes); - - let file_metadata = metadata - .map(Ok) - .unwrap_or_else(|| read::read_metadata(&mut reader))?; - - let parq_fields = if let Some(projection) = projection { - let parq_fields = file_metadata.schema().fields(); - Cow::Owned( - projection - .iter() - .map(|i| parq_fields[*i].clone()) - .collect::>(), - ) - } else { - Cow::Borrowed(file_metadata.schema().fields()) - }; - - let n_groups = file_metadata.row_groups.len(); - let mut dfs = Vec::with_capacity(n_groups); - - // we need to store two buffers to be reused, so the contention pool size - // is the number of threads * 3 b1, b2, and column_chunks - let pool_size = POOL.current_num_threads() * 2 + 1; - - let cont_pool = LowContentionPool::>::new(pool_size); - - for row_group in 0..n_groups { - let md = &file_metadata.row_groups[row_group]; - if let Some(pred) = &predicate { - if let Some(pred) = pred.as_stats_evaluator() { - if let Some(stats) = collect_statistics(md.columns(), arrow_schema)? { - let should_read = pred.should_read(&stats); - // a parquet file may not have statistics of all columns - if matches!(should_read, Ok(false)) { - continue; - } else if !matches!(should_read, Err(PolarsError::NotFound(_))) { - let _ = should_read?; - } - } - } - } - // test we don't read the parquet file if this env var is set - #[cfg(debug_assertions)] - { - assert!(std::env::var("POLARS_PANIC_IF_PARQUET_PARSED").is_err()) - } - - let columns = POOL.install(|| { - parq_fields - .par_iter() - .enumerate() - .map(|(mut field_i, field)| { - if let Some(projection) = projection { - field_i = projection[field_i]; - } - - // - - // create a new reader - let reader = Cursor::new(bytes); - - let b1 = cont_pool.get(); - // get compressed column pages - let mut columns = read::get_column_iterator( - reader, - &file_metadata, - row_group, - field_i, - None, - b1, - ); - - let mut column_chunks = Vec::with_capacity(64); - while let read::State::Some(mut new_iter) = columns.advance().unwrap() { - if let Some((pages, metadata)) = new_iter.get() { - let pages = pages.collect::>(); - - column_chunks.push((pages, metadata.clone())); - } - columns = new_iter; - } - - // - let columns = read::ReadColumnIterator::new(field.clone(), column_chunks); - let field = &arrow_schema.fields[field_i]; - - let b2 = cont_pool.get(); - let (arr, b1, b2) = read::column_iter_to_array(columns, field, b2)?; - cont_pool.set(b1); - cont_pool.set(b2); - Series::try_from((field.name.as_str(), Arc::from(arr) as ArrayRef)) - }) - .collect::>>() - })?; - let mut df = DataFrame::new_no_checks(columns); - apply_predicate(&mut df, predicate.as_deref())?; - apply_aggregations(&mut df, aggregate)?; - - dfs.push(df) - } - - if dfs.is_empty() { - let schema = if let Some(proj) = projection { - Cow::Owned(apply_projection(arrow_schema, proj)) - } else { - Cow::Borrowed(arrow_schema) - }; - Ok(arrow_schema_to_empty_df(&schema)) - } else { - let mut df = accumulate_dataframes_vertical(dfs.into_iter())?; - apply_aggregations(&mut df, aggregate)?; - Ok(df.slice(0, limit)) - } -} diff --git a/py-polars/Cargo.lock b/py-polars/Cargo.lock index 41e2837b70a7..8f86804faaed 100644 --- a/py-polars/Cargo.lock +++ b/py-polars/Cargo.lock @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.52" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84450d0b4a8bd1ba4144ce8ce718fbc5d071358b1e5384bace6536b3d1f2d5b3" +checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" [[package]] name = "array-init-cursor" @@ -68,7 +68,7 @@ dependencies = [ [[package]] name = "arrow2" version = "0.9.1" -source = "git+https://github.com/ritchie46/arrow2?branch=cherry_pick#38b8232c2c182702ea450200aeddd4edfff82c64" +source = "git+https://github.com/jorgecarleitao/arrow2?rev=0175d9e3c54f6c3c81e3a6db3f1c39b4ba3b93fe#0175d9e3c54f6c3c81e3a6db3f1c39b4ba3b93fe" dependencies = [ "arrow-format", "base64", @@ -164,9 +164,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.2" +version = "3.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cb90ade945043d3d53597b2fc359bb063db8ade2bcffe7997351d0756e9d50" +checksum = "f838e47a451d5a8fa552371f80024dd6ace9b7acdf25c4c3d0f9bc6816fb1c39" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -257,9 +257,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.46" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b858541263efe664aead4a5209a4ae5c5d2811167d4ed4ee0944503f8d2089" +checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" dependencies = [ "cc", ] @@ -278,18 +278,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" +checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -308,9 +308,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -321,9 +321,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ "cfg-if 1.0.0", "lazy_static", @@ -439,9 +439,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" +checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" dependencies = [ "futures-channel", "futures-core", @@ -454,9 +454,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", "futures-sink", @@ -464,15 +464,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-executor" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" dependencies = [ "futures-core", "futures-task", @@ -481,15 +481,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" +checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" [[package]] name = "futures-macro" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" +checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" dependencies = [ "proc-macro2", "quote", @@ -498,21 +498,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.19" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-channel", "futures-core", @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if 1.0.0", "libc", @@ -602,9 +602,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ "autocfg", "hashbrown 0.11.2", @@ -786,9 +786,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.112" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "libm" @@ -798,9 +798,9 @@ checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" [[package]] name = "libm" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" +checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" [[package]] name = "libmimalloc-sys" @@ -826,9 +826,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -1052,7 +1052,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", - "libm 0.2.1", + "libm 0.2.2", ] [[package]] @@ -1067,9 +1067,9 @@ dependencies = [ [[package]] name = "numpy" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e590538dba8432d54d3587b06df73d7c044e83cfa4b200cbc7d0567f924ac0a7" +checksum = "7f3a190dd1aa88ee0de91e59e970d5b85cfa079a9ff6531b69f811ccd0c2a6e1" dependencies = [ "cfg-if 0.1.10", "libc", @@ -1395,9 +1395,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" dependencies = [ "proc-macro2", ] @@ -1435,9 +1435,9 @@ dependencies = [ [[package]] name = "rand_distr" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964d548f8e7d12e102ef183a0de7e98180c9f8729f555897a857b96e48122d2f" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", "rand", @@ -1539,18 +1539,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -1559,9 +1559,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.74" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" dependencies = [ "indexmap", "itoa 1.0.1", @@ -1613,9 +1613,9 @@ checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "snap" @@ -1670,9 +1670,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.84" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecb2e6da8ee5eb9a61068762a32fa9619cc591ceb055b3687f4cd4051ec2e06b" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" dependencies = [ "proc-macro2", "quote", @@ -1781,18 +1781,18 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "zstd" -version = "0.9.1+zstd.1.5.1" +version = "0.9.2+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538b8347df9257b7fbce37677ef7535c00a3c7bf1f81023cc328ed7fe4b41de8" +checksum = "2390ea1bf6c038c39674f22d95f0564725fc06034a47129179810b2fc58caa54" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "4.1.2+zstd.1.5.1" +version = "4.1.3+zstd.1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb4cfe2f6e6d35c5d27ecd9d256c4b6f7933c4895654917460ec56c29336cc1" +checksum = "e99d81b99fb3c2c2c794e3fe56c305c63d5173a16a46b5850b07c935ffc7db79" dependencies = [ "libc", "zstd-sys",