ExternalSort 1.0.0-beta001
This is a prerelease version of ExternalSort.
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package ExternalSort --version 1.0.0-beta001
NuGet\Install-Package ExternalSort -Version 1.0.0-beta001
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ExternalSort" Version="1.0.0-beta001" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ExternalSort --version 1.0.0-beta001
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: ExternalSort, 1.0.0-beta001"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ExternalSort as a Cake Addin #addin nuget:?package=ExternalSort&version=1.0.0-beta001&prerelease // Install ExternalSort as a Cake Tool #tool nuget:?package=ExternalSort&version=1.0.0-beta001&prerelease
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
External Sort
Sorts data (IAsyncEnumerable<T>) that is larger than the amount of RAM available.
basic example
IAsyncEnumerable<User> myUsersToSort = ...
var sortedUsers = myUsersToSort
.OrderByExternal(u => u.Email);
Behaviour
- Unstable sort - the rows that 'tie' will be returned in an undefined way
- O(n log n) - best case performance when the data fits in RAM. The more RAM you give it, the faster it will sort. More performance details here https://en.wikipedia.org/wiki/External_sorting
- No disk activity when data fits in RAM
Options / Features
Sort Descending
IAsyncEnumerable<User> myUsersToSort = ...
var sortedUsers = myUsersToSort
.OrderByDescendingExternal(u => u.Email);
Sort on multiple properties
IAsyncEnumerable<User> myUsersToSort = ...
var sortedUsers = myUsersToSort
.OrderByExternal(u => u.Email)
.ThenBy(u => u.FirstName)
.ThenByDescending(u => u.UserId);
Control the amount of RAM used
IAsyncEnumerable<User> myUsersToSort = ...
var sortedUsers = myUsersToSort
.OrderByExternal(u => u.Email)
.OptimiseFor(calculateBytesInRam: u => u.CalculateBytesInRam(), mbLimit: 1_000, openFilesLimit: 10);
- calculateBytesInRam - Calculates how much ram the row occupies in RAM. Not calculated for every row, but enough to get an average. Default = 300 bytes
- mbLimit - The rough limit how much RAM to use to sort the data. In practice this is not exact, but it will never be unlimited. Default = 200 MB
- openFilesLimit - The number of files open at one time. A larger number can reduce the number of files needed to sort, but then each file has a smaller buffer and can become too "chatty" with the disk. Buffer size for one temp file = mbLimit / openFileLimit. Default = 10
Internally, ExternalSort uses Parquet temp files. See https://github.com/aloneguid/parquet-dotnet for class serialisation options.
Thanks to https://josef.codes/sorting-really-large-files-with-c-sharp/ for the inspiration.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- Parquet.Net (>= 4.23.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.0.0-beta02 | 2,029 | 7/4/2024 |
2.0.0-beta01 | 91 | 7/4/2024 |
1.2.0 | 98 | 5/15/2024 |
1.2.0-beta001 | 819 | 4/15/2024 |
1.1.0 | 132 | 4/14/2024 |
1.1.0-beta003 | 173 | 4/11/2024 |
1.1.0-beta002 | 87 | 4/11/2024 |
1.1.0-beta001 | 112 | 4/10/2024 |
1.0.0 | 111 | 4/9/2024 |
1.0.0-beta005 | 145 | 4/8/2024 |
1.0.0-beta004 | 81 | 4/8/2024 |
1.0.0-beta003 | 118 | 4/8/2024 |
1.0.0-beta002 | 100 | 4/7/2024 |
1.0.0-beta001 | 96 | 4/4/2024 |